0

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

    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"。谁能指出我正确的方向?

4

1 回答 1

1

正如MSDNCStdioFile在其默认的文本模式中所说:

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

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

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

CStdioFile file;
file.Open (_T("1.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
file.WriteString(m_adtxt);
file.Close ();
于 2014-01-14T05:56:04.757 回答