vc读取文件问题

没原来那个名字长了 2009-07-03 01:31:08
我现在的问题是我有一文本里面是我自己写的一行一行的文件比如:
张三
123456789
李四
123456789
文本的格式是可以自己定的比如:
_1_张三_123456789
_2_李四_133333333
然后我想要一次读取一个名字跟一个号码然后分别分开来写到我别一个程序的文件输入框中去
注意我有两个输入框一个是写名字的一个是写号码的
还有我想读取一个名字跟号码后如果关闭程序再读取时不要读取已经读取的名字跟号码
我的想法是用一个临时文件做比较..把关闭程序前最后读取的名字保存到另一个文件然后下次读的时候从保存的后面读取进来
不知道有没有更好的想法....
CString strLine;
CStdioFile file;
file.Open("a.txt", CFile::modeRead);
file.ReadString(strLine);
这样读取一行我知道但比较我就不知道还要分割名字跟号码分别写到两个输入框中去(代码真难,只怪我英语太差了,基本是小学英语水平)
正在网上搜索中ing......如果这里的大大们可以不吝赐教的话帮忙给点参考代码小弟万分感谢....分当然全给代码的了
注意我只想用.txt格式的文件因为其它格式的话修改起来还要装其它软件来改又或是还得写个软件来改但我只想用记事本就可以改这样方便
...全文
1625 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
七拼八凑终于有点象样了
if(mainhwnd1 != NULL)
{
hwnd2 = ::FindWindowEx (mainhwnd1, NULL, "#32770", NULL);
hwnd1 = ::GetDlgItem(hwnd2,0x331E);
hwnd3 = ::FindWindowEx (mainhwnd1, NULL, "#32770", NULL);
hwnd5 = ::GetDlgItem(hwnd3,0x331F);
CString strLine, strLine1, abc;
DWORD a , c;
int b;
CStdioFile file;
file.Open("b.txt", CFile::modeRead);
file.ReadString(abc);
b= _ttoi(abc);
c=(DWORD)b;
if (c>120)
{
c=0;
}
file.Close();
file.Open("a.txt", CFile::modeRead);
file.Seek(c,CFile::begin );
file.ReadString(strLine);
file.ReadString(strLine1);

a= file.GetPosition();
CString s;
s.Format("%d" , a);



::SendMessage (hwnd1, WM_SETTEXT, NULL,(LPARAM)(LPCTSTR)strLine);
::SendMessage (hwnd5, WM_SETTEXT, NULL,(LPARAM)(LPCTSTR)strLine1);
file.Close();
file.Open("b.txt", CFile::modeCreate | CFile::modeWrite);
file.WriteString(s);
file.Close();

vc编过之后按下按我想要的输出了......
不知各位大侠有什么看法....我感觉怪怪的....算了先洗洗睡了.....明天再弄....
  • 打赏
  • 举报
回复
先谢了...我的问题昨天就解决了...结贴去了...
supconsupcon 2009-07-04
  • 打赏
  • 举报
回复
如果你非要使用记事本的话,给你一个字符串的分割函数吧
strIn:需要分割的字符串
strAryRe:返回保存分割后的字符串
str:分割字符串(分割的标准)

int CSysCfgApp::SplitCString(CString &strIn, CStringArray& strAryRe, LPCTSTR str)
{
if (str == _T(""))
{
strAryRe.RemoveAll();
return 0;
}

int nStart = 0;
int nEnd = 0;
CString strTmp;
while ( (nEnd = strIn.Find(str, nStart)) != -1 )
{
strTmp = strIn.Mid(nStart, nEnd-nStart);
strAryRe.Add(strTmp);
nStart = nEnd+2;
}
strTmp = strIn.Mid(nStart, strIn.GetLength());
strAryRe.Add(strTmp);

return strAryRe.GetSize();
}
  • 打赏
  • 举报
回复
楼上的如果我的程序关闭了呢?
启动时怎么判断已经读取过的
xmrforever 2009-07-04
  • 打赏
  • 举报
回复
多了一行len=ftell(file); //将文件长度付给变量len
xmrforever 2009-07-04
  • 打赏
  • 举报
回复
写了一个分析文件内容的代码,LZ参考下

FILE *file;
file=fopen(m_mFile,"rb"); //m_mFile是文件的路径
char *pBuf;
fseek(file,0,SEEK_END); //将文件指针移动到文件结尾处
int len=ftell(file); //将文件长度付给变量len
len=ftell(file); //将文件长度付给变量len
pBuf=new char[len+1];
rewind(file); //将文件指针移动到文件开始处
fread(pBuf,1,len,file); //将文件内容写入pBuf
for(i=0;i<len;i++)
{
//1如果有标志位,可用switch来判断标志
switch (pBuf[i])
{
case '...':...;
break;
default:
break;
}
//2如果文件行有固定的字节数,可计算文件指针的位移量
//3可以判断pBuf[i]的回车
}
  • 打赏
  • 举报
回复
这方面的资料好少哦...window程序设计里根本没讲文件操作...MFC深入浅出只是简单的列出类跟函数甚至连个列子都没有....孙老师的C++视频里也只是讲到读取文件内容跟输出文件内容....关于点位一点也没讲到
还有计算偏移之类的更是没有讲...
希望大鸟们帮忙写出点参考代码.....貌似论坛上搜索过挺多人问但都是没有解决掉.....要么是vb跟php的不适用vc++....郁闷
  • 打赏
  • 举报
回复
用CMarkup吧 写XML很容易
岁月小龙 2009-07-03
  • 打赏
  • 举报
回复
读取文件应该不难
  • 打赏
  • 举报
回复
那如果我在第一行文字前加上: _1
第二行加上: _2
第三行加上: _3
.........

这样的话是不是算加上特殊分隔符

然后我就是不知道怎么用file.ReadString or ReadFile去利用
难道用sscanf去过滤?
greatws 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 free365 的回复:]
问题是用file.ReadString我不知道如何忽略读
[/Quote]

只调用不处理就行了
skyler2008 2009-07-03
  • 打赏
  • 举报
回复
可以在名字和号码后分别加特殊分隔符,利用该分割符去读就好了
  • 打赏
  • 举报
回复
问题是用file.ReadString我不知道如何忽略读
oyljerry 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 free365 的回复:]
void CMy1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND  hwnd1;
HWND  hwnd2;
HWND  hwnd3;
HWND  hwnd4;
HWND  hwnd5;
HWND mainhwnd1;
mainhwnd1=::FindWindow("IEFrame",NULL);
if(mainhwnd1  !=  NULL)
{
hwnd2  =  ::FindWindowEx  (mainhwnd1,  NULL,  "WorkerW",  NULL);
hwnd3  =  ::FindWindowEx  (hwnd2,  NULL,  "ReBarWindow32",  NULL);
hwnd4  =  ::FindWind…
[/Quote]
你需要代码中记录上次读过的语句,要么记住内容,要么行号等,下次读的时候,这些内容就忽略掉
hendriclee 2009-07-03
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
void CMy1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd1;
HWND hwnd2;
HWND hwnd3;
HWND hwnd4;
HWND hwnd5;
HWND mainhwnd1;
mainhwnd1=::FindWindow("IEFrame",NULL);
if(mainhwnd1 != NULL)
{
hwnd2 = ::FindWindowEx (mainhwnd1, NULL, "WorkerW", NULL);
hwnd3 = ::FindWindowEx (hwnd2, NULL, "ReBarWindow32", NULL);
hwnd4 = ::FindWindowEx (hwnd3, NULL, "ComboBoxEx32", NULL);
hwnd5 = ::FindWindowEx (hwnd4, NULL, "ComboBox", NULL);
hwnd1 = ::GetDlgItem(hwnd5,0xA205);
CString strLine;
CStdioFile file;
file.Open("a.txt", CFile::modeRead);
file.ReadString(strLine);
file.Close();

::SendMessage (hwnd1, WM_SETTEXT, NULL,(LPARAM)(LPCSTR)strLine);
::UpdateWindow (mainhwnd1);
file.Open("b.txt", CFile::modeWrite);
file.WriteString(strLine);
file.Close();
}
else
MessageBox("找不到IE");

}
改成这样是可以把读取的文字保存到b文件中去了但不懂的下次读取时跳过已经读取过的中文
oyljerry 2009-07-03
  • 打赏
  • 举报
回复
fgets按行读取文件内容,每一行保存..

  • 打赏
  • 举报
回复
a.txt的内容如下:
写到IE地址栏1
写到IE地址栏2
写到IE地址栏3
.................
文件可能很大
我想知道的是怎样读取字符串比较,分割字符串,从指定的字符开始读起
比较用strcmp??分割的话是不是先转(LPCSTR)strLine,然后用char[]数组一个一个跟ascii码比较??读的话是不是if指定的ascii码。。。。然后?????全读进来find???文件很大的话也全读?(1MB左右)
怎么样才能使它再次按下按钮时写出第二行内容还有如果程序关闭后再打开时不重新输出已经输出过的内容(再用个.txt文件保存最后输出然后再比较?)
实现代码......不会....
  • 打赏
  • 举报
回复
不能代码至少给我几个关键字啊...好让我知道要搜索什么...
搜索一下午网上跟csdn中没有一个用vc做读取字符串比较,分割字符串,从指定的字符开始读起...
fengrx 2009-07-03
  • 打赏
  • 举报
回复
INI
XML
txt
数据库
加载更多回复(11)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧