mfc c ++文本写入文件后的奇怪块字符

时间:2014-01-13 16:11:38

标签: c++ mfc save cfile

我的程序有两个编辑控件框,用于显示文本文件中的文本,并且它们都有与之关联的按钮,如果在编辑控件框中写入或删除了任何内容,则会更新与其关联的文本文件。我有这个代码从文本文件中读取

    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"。任何人都能指出我正确的方向吗?

1 个答案:

答案 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