2 qq 28254507 qq_28254507 于 2016.03.01 13:33 提问

MFC CStdioFile::ReadString()的问题

想一行行读取数据,并且我希望是从第二行开始读取,即第一行的跳过去。
于是我用了ReadString(),并且打开文件后先读取第一行,但是不保存第一行的数据,然后从第二行开始储存数据,代码如下:

 void RichEditView::ReadArticle(CString strName)
{
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
    CString content = "";
    CStdioFile File;
    CString fileName = strName;
    if (File.Open(fileName, CFile::modeRead | CFile::typeBinary))
    {
        File.SeekToBegin();
        CString str = "";
        File.ReadString(str); // 读取第一行,不保存
        while (File.ReadString(str)) //从第二行开始逐行读取
        {
            content += str;
            AfxMessageBox(str);
        }
        File.Close();
    }
    else
        AfxMessageBox("读取失败!");
    ::SetWindowText(this->GetRichEditCtrl().m_hWnd, content);
}

运行正常的,正常读取出来,但是我读取完打开文件发现文本内容被改了。。
见图:
图片说明

原本的数据

图片说明

读取并显示(第一行和第二行是两个视图在显示)

图片说明

之后打开文本发现数据变了

图片说明

再次读取显示也出问题了

于是我把读取第一行的那个

 File.ReadString(str); // 读取第一行,不保存

语句注释掉,再重复上面的操作,一切正常,但是这显然不是我要的效果,
而且我发现貌似读取一次后,第二次读取显示的第一行是原来显示的第二行(即tttttt)
困惑很久了。究竟是哪里错了。。。

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.01 13:51
已采纳

这段代码的确没有修改文件,但是你有没有别的地方写了文件。打开文件什么也不做,在任务管理器强行关闭,看看会改文件么

qq_28254507
qq_28254507 有没有办法在用户改变了编辑控件内容的时候才调用OnEnChange()啊。。content += str;为什么也会调用它呢。。
2 年多之前 回复
qq_28254507
qq_28254507 哦找到问题了。我发现在执行content += str;时会调用OnEnChange()函数
2 年多之前 回复
qq_28254507
qq_28254507 我在File.Open()后直接File.Close()没有文件的确任何变动。。
2 年多之前 回复
qq_28254507
qq_28254507   2016.03.01 13:37

况且我设置了只读,不应该会改数据吧。。

qq_28254507
qq_28254507   2016.03.01 15:26

其实就是

  File.ReadString(str); // 读取第一行,不保存

这句加上就有问题了。。搞不懂是咋回事了。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
VS2012 MFC CStdioFile ReadString 处理UTF8文档乱码的方法
CStdioFile 的ReadString读写UTF8会出现乱码现象。需要转换。//转换函数void CharToUTF8(CString &str){    char *szBuf = new char[str.GetLength() + 1];//注意“+1”,char字符要求结束符,而CString没有memset(szBuf, '\0',str.GetLength());int ...
如何使用CStdioFile::ReadString来读文件
点评:对于一般文件的读取,建议还是用CStdioFile来进行行的读与写操作,这样非常方便的. [问题提出]   一数据文件一行一条记录,我用file.ReadString()一次读一行,并对读取的数据做一些处理;   请问:while(文件还没到结尾) { file.ReadString(); ... } 文件还没到结尾如何判断?如果,到了指定位置不读了,过一会儿再读
CStdioFile的ReadString读入中英文的总结(unicode-ucs2/utf8-无bom/ansi) .
文章讨论的前提:使用ReadString来读取字符串 utfi/ansi情况下,不能使用binary来打开,因为这种模式下,一次按照TCHAR的大小,读取两个字符,结束符号0d的话,需要读取到0x 0d 00才会认为是读取一行结束。而我们知道untf8/ansi情况存储的话,里面是没有0x00存在的。 utf8/ansi情况下,使用typetext打开,可以把字符读入到CString里面,但存
CStdioFile之ReadString()与WriteString()注意事项
CStdioFile CObject  └CFile     └CStdioFile 一个CStdioFile对象代表一个用运行时函数fopen打开的C运行时流式文件。 流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。 文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFi
CStdioFile.ReadString读取中文产生乱码解决方法
首先需要明确:1、CStdioFile对Unicode的支持不好,最好采用CFile进行读取操作;2、在Unicode环境下ReadString按char读取,并填入Unicode的CString变量中。对于包含中文的ANSI文本,采用File.ReadString读取,如果不进行转换一定会产生乱码。 经过在CSND的一番折腾,找到解决办法如下: void CTestDlg::Re
使用CStdioFile::ReadString来逐行读取文件
ReadString本身就是一次读取一行,非常方便。直接上函数:{   CStdioFile file;     CString str;   file.Open("file.txt",CFile::modeRead);   while(file.ReadString(str))   {      //控件写入数据      //SetDlgItemText(IDC_EDIT, ctr);   }...
CStdioFile ReadString 在unicode环境下汉字显示的乱码的问题。
txt文本是unicode编码格式,但ReadString后,显示汉字是乱码的。以下是解决办法。  CString CSetupForm::GetTxtfile(CString txtdir)  //参数为文件路径 {   CStdioFile file; if(file.Open(txtdir,CFile::modeNoTruncate | CFile::modeRead |
如何使用CStdioFile::ReadString来读文件[转载]
[点评:对于一般文件的读取,建议还是用CStdioFile来进行行的读与写操作,这样非常方便的.] [问题提出]   一数据文件一行一条记录,我用file.readstring()一次读一行,并对读取的数据做一些处理;   请问:while(文件还没到结尾)   {   file.readstring();   ...   }   ??文件还没到结尾如何判断?   如果,到了
使用CStdioFile 读取Unicode文件时出现乱码问题解决方案
使用CStdioFile 读取Unicode文件时出现乱码问题解决方案 我们都知道在stdFile.ReadString(temp)中,temp是CString类型,但是我们接收到的数据由于是宽字符 ,所以在CEditBox显示有乱码。   可能网上提供了大量的方法将WCHAR或者wchar_t转化为CString的方法,不可少都用到了 MultiByteToWideChar和Wid
CStdioFile的ReadString在 debug下面行,release下面不行的解决方法
描述: 当调试到ReadString后直接崩溃修改之前CStdioFile PassKeyFile; CString CMFCFile = GetAppPath().c_str(); CMFCFile = CMFCFile + "\\test.txt"; PassKeyFile.Open(CMFCFile, CFile::modeRead); vector<CString>vectPassKey;