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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!