【问题标题】:Is it really possible to append data to a text file in MFC's by using CFile and CStdio classes?真的可以通过使用 CFile 和 CStdio 类将数据附加到 MFC 中的文本文件吗?
【发布时间】:2016-05-20 10:34:00
【问题描述】:

真的可以通过使用CFileCStdio 类将数据附加到MFC 中的文本文件吗??如果是,那么如何?

我使用下面的代码来追加数据,但它只是给出了最新(最后输入的)数据..

UpdateData(TRUE);
CStdioFile file_object;//(L"D://Docs//Temp.txt",
    CFile::modeCreate | CFile::modeReadWrite | CFile::modeRead); 
CString str = L"D://Docs//Temp.txt";
CString fc1, fc2;

BOOL bFile = file_object.Open(str, 
    CFile::modeCreate | CFile::modeReadWrite | CFile::modeRead);
if (bFile)
    file_object.Seek(file_object.GetLength(), CFile::end);

fc1.Format(L"%f", m_CelTemp);
file_object.WriteString(L"Temp in Celsius is:");     
file_object.WriteString(fc1);
file_object.WriteString(L"\n");

fc2.Format(L"%f", m_FarTemp);
file_object.WriteString(L"Temp in Fahrenheit is:");      
file_object.WriteString(fc2);
file_object.WriteString(L"\n");

UpdateData(FALSE); 

【问题讨论】:

  • 您的代码无法编译,存在明显错误。
  • 喜欢?? @BarmakShemirani
  • 试试看。另请参阅发布指南中有关最小但完整示例的部分。
  • @UlrichEckhart 但请告诉我,我应该尝试什么??

标签: c++ visual-c++ mfc file-handling


【解决方案1】:

这是您可以尝试的示例代码

CStdioFile file;
file.Open(_T("_FILE_PATH_HERE"),CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
file.SeekToEnd();
file.WriteString(_T("Write Text Here\r\n")); // \r\n to move the cursor to the next line
file.Close();

CFile::modeCreate 如果文件不存在,则创建一个新文件。如果文件已经存在,则引发 CFileException。

CFile::modeNoTruncate 如果文件不存在则创建一个新文件;否则,如果文件已经存在,则附加到 CFile 对象。

CFile::modeWrite 只请求写访问。

file.SeekToEnd(); 将文件指针的值设置为文件的逻辑结尾。

【讨论】:

  • NoTruncate 如果不存在文件,则不会创建该文件。这是文档中的错误。自 2008 年出名,这很有趣。
  • modeCreate 覆盖现有文件。这是怎么做到的?
  • 如果 CFile::modeCreate 在文件已经存在的情况下抛出异常,那么您的代码将永远不会附加到现有文件。
【解决方案2】:

您应该使用CFile::SeekToEnd() 方法将文件指针的值设置为文件的逻辑末尾以便追加数据。

这是一个例子:

CStdioFile f;
CString sDataToWrite(_T("Data\r\n"));
if(f.Open(_T("C:\\Files\\file.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite)) 
{
      f.SeekToEnd();
      f.WriteString(sDataToWrite);  
}
f.Close();

【讨论】:

  • 我也试过了,但在调试时我检查了输入第一组细节后光标指针不会结束。
  • 问题是你使用了带有错误参数的Seek方法而不是SeekToEnd()
  • 好吧,假设我不使用 Seek 方法,那我该怎么办,还有其他方法吗??
  • 我已经更新了答案,为您提供如何使用它的示例
【解决方案3】:

首先,从第 3 行开始,您发布的内容无法编译。请贴出真实代码。

最好的猜测是问题出在CFile::modeCreate,它“如果不存在文件,则创建一个新文件。如果文件已经存在,则会引发 CFileException。”(请参阅​​ @ 的参考文档987654321@)。你可能想要CFile::modeNoTruncate,它是“open existing”。

【讨论】:

    【解决方案4】:

    是的,可以使用 CFile 和 CStdioFile 附加数据。 你必须使用

    FileObj.Open(L"FileName.txt",CFile ::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);

    简单示例

    CFile FileObj;
    //CStdioFile FileObj;
    
    //  FileObj.Open(L"FileName.txt",CStdioFile ::modeCreate | CStdioFile::modeWrite | CStdioFile::modeNoTruncate);
    FileObj.Open(L"FileName.txt",CFile ::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);
    FileObj.SeekToEnd();
    CString Message = m_strName ;       // Whetever Your Message
    FileObj.Write(Message,Message.GetLength());
    FileObj.Flush();
    FileObj.Close();
    

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2021-10-11
      • 2012-11-24
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多