C++ 是否真的可以在MFC';通过使用CFile和CStdio类来实现?

C++ 是否真的可以在MFC';通过使用CFile和CStdio类来实现?,c++,visual-c++,mfc,file-handling,C++,Visual C++,Mfc,File Handling,是否真的可以使用CFile和CStdio类将数据附加到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 =

是否真的可以使用
CFile
CStdio
类将数据附加到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); 
我使用了下面的代码来附加数据,但它只提供了最新的(最后输入的)数据

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); 

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

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); 

最好的猜测是问题出在
CFile::modeCreate
上,它“如果没有文件存在,则创建一个新文件;如果文件已经存在,则会引发CFileException。”(请参阅中的参考文档)。您可能需要“打开现有”的
CFile::modeNoTruncate

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

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); 
以下是一个例子:

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); 
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();

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

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); 
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

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); 
CFile::modeNoTruncate如果不存在文件,则创建一个新文件;否则,如果文件已存在,则会将其附加到CFile对象

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); 
CFile::modeWrite仅请求写访问权限

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); 

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

是,可以使用CFile和CStdioFile追加数据。
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); 
你必须使用

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); 
FileObj.Open(L“FileName.txt”,CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate)

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); 
简单例子

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); 
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();

你的代码无法编译,有明显的错误。比如@Barmakshemirantry。另请参见发布指南中关于最小但完整示例的部分。@UlrichEckhart但请告诉我,我应该尝试什么?我也尝试过这个,但是在调试过程中,我检查了光标指针在输入第一组详细信息后是否不会结束。问题是,您使用的是带有错误参数的
Seek
方法,而不是
SeekToEnd()
好吧,假设我不使用Seek方法,那么我应该怎么做,有其他方法吗??
SeekToEnd()
是一种方法:我更新了答案,为您提供了一个如何使用它的示例。如果没有文件,NotRuncate不会创建文件。这是文件中的一个错误。从2008年起就知道了,这很有趣。
modeCreate
覆盖现有文件。这是如何工作的?如果
CFile::modeCreate
在文件已经存在时抛出异常,那么您的代码将永远不会附加到现有文件。