我的程序有两个编辑控件框,用于显示文本文件中的文本,并且它们都有与之关联的按钮,如果在编辑控件框中写入或删除了任何内容,则会更新与其关联的文本文件。我有这个代码从文本文件中读取
try
{
CStdioFile file(_T("1.txt"), CFile::modeRead);
CString str,mainstr = _T("");
while(file.ReadString(str))
{
mainstr += str;
mainstr += _T("\r\n");
}
CWnd *editwindow = this->GetDlgItem(IDC_EDIT2);
editwindow->SetWindowText(mainstr);
}
catch(CException* e)
{
MessageBox(_T("no such file"));
e->Delete();
}
然后将此代码写入文本文件
m_addtext.GetWindowText(m_adtxt);
if ( IsDlgButtonChecked(IDC_RADIO1) == BST_CHECKED )
{
CStdioFile file;
file.Open (_T("1.txt"), CFile::modeCreate | CFile::modeWrite);
file.WriteString (m_adtxt);
file.Close ();
}
这一切对我想要的东西都很好用,但问题是如果我在编辑框中删除了一个字符,它会在一个单词后面添加一个块字符,然后单击更新按钮。有时它甚至会在每个单词之后添加一个块,并在每个空行上添加一个块。只要它创建一个新文件并且没有删除任何内容,它就能正常工作。我试过null终止,我试过ccs="encoding"
。任何人都能指出我正确的方向吗?
答案 0 :(得分:1)
MSDN says关于CStdioFile
的默认文字模式:
文本模式为回车换行提供特殊处理 对。将换行符(0x0A)写入文本模式时 CStdioFile 对象,字节对(0x0D,0x0A)被发送到该文件。 读取时,字节对(0x0D,0x0A)将转换为单个字节 0x0A字节。
所以,虽然你的阅读看起来没问题,因为\n
会因你使用的ReadString
重载而被剥离,那么你已经手动附加\r\n
以正确显示编辑控件,但是当您保存内容时,每个\r\n
都将被解释为\r\r\n
,如上面引用中所述。
解决方案是在写入\r
之前删除字符串中的所有CStdioFile
个字符,只保留\n
个字符,并让{ {1}}为您插入CStdioFile
。或者,更容易,只需以二进制模式而不是文本模式打开文件以禁止此转换:
\r