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

Posted

技术标签:

【中文标题】将文本写入文件后的mfc c++奇怪的块字符【英文标题】:mfc c++ strange block characters after text written to file 【发布时间】:2014-01-13 16:11:38 【问题描述】:

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

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

对于我想要的,这一切都很好,而且花花公子,但问题是,如果我在编辑框中删除一个字符,然后单击更新按钮,它会在一个单词后添加一个块字符。有时它甚至在每个单词之后添加一个块,在每个空行上添加一个块。只要它创建一个新文件并且没有任何内容被删除,它就可以正常工作。我试过空终止,我试过ccs="encoding"。谁能指出我正确的方向?

【问题讨论】:

刚刚意识到在创建文件时一切都很好,但在我的程序中编辑文件时出现了问题,而不仅仅是删除字母、单词或空格。所以基本上任何对现有文件的修改都会在每行最后一个单词的末尾添加一个奇怪的正方形字符,而空行包含 1 个正方形。 只是想知道您是否为编辑控件启用了 ES_MULTILINE 编辑控件启用了多行。我遇到的唯一问题是,每次单击更新按钮时,每行的最后一个单词都会添加一个方框字符。 您的行很可能以错误的行终止符序列终止,例如"\n\r\n" 而不是 \r\n。你能调试和检查 HEX 形式的字符串缓冲区中的内容吗? 【参考方案1】:

作为MSDN says 关于CStdioFile 在其默认的文本模式下:

文本模式为回车-换行提供特殊处理 对。当您将换行符 (0x0A) 写入文本模式时 CStdioFile 对象,字节对(0x0D,0x0A)被发送到文件中。 读取时,字节对 (0x0D, 0x0A) 被转换为单个 0x0A 字节。

所以,虽然你的阅读看起来没问题,因为 \n 将被你使用的 ReadString 的重载剥离,然后你手动附加了 \r\n 以在编辑控件中正确显示,但是当你保存内容,每个\r\n 将被解释为\r\r\n,如上面的引用所述。

解决方案是从字符串中删除所有\r 字符在写入CStdioFile 之前,只留下\n 字符,然后让CStdioFile 插入@987654332 @ 为你。或者,更简单的是,只需以二进制模式而不是文本模式打开文件即可抑制这种转换:

CStdioFile file;
file.Open (_T("1.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
file.WriteString(m_adtxt);
file.Close ();

【讨论】:

我在使用CFile::typeBinary 时遇到的问题是,读取后只在编辑控件中显示 1 个字符(在文件中它很好,并且不会创建任何框)。好吧,除非我也用CFILE::typeBinary 阅读它,但是我遇到了和以前一样的问题,因为额外的框字符。我也曾尝试在写作之前删除\r 字符,但这似乎也无济于事。不过,我想我可能不得不继续研究这种方法,以防万一我做得不对。如果我仍然无法解决这个问题,我会回帖。感谢您的帮助。 @user3179762 我的意思是像现在一样读取它,但只需将已修改的字符串中的 writing 设置为二进制有 \r\n 分隔符。 当我像现在一样离开阅读,然后用二进制集写入时,它只会在编辑控件中显示一个字符。 好吧,如果我使用富编辑控件 2.0,我所拥有的一切都可以正常工作,我所要做的就是不添加 \r\n。我可以改用它,尽管我会继续尝试让它与编辑控件一起使用。再次感谢您的帮助。

以上是关于将文本写入文件后的mfc c++奇怪的块字符的主要内容,如果未能解决你的问题,请参考以下文章

MFC 将含中文的CString写入文本

将文本文件中的块写入多个新文件

使用 Write 成员将 CString 写入 CFile 时每个字符后的 Null

c++文件怎么从文件中读出和写入字符串?

如何将特殊字符原样写入 XML 文件

如何使用“保存到..”对话框将字符串从 EditControl 写入 Visual Studio 2008 中的文本文件?