MFC C ++ странные символы блока после текста, записанного в файл

моя программа имеет два блока управления редактированием, которые отображают текст из текстового файла, и у них обоих есть связанные с ними кнопки, которые обновляют текстовые файлы, связанные с ними, если что-либо записывается или удаляется в полях управления для редактирования. у меня есть этот код для чтения из текстового файла

    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", Может кто-то указать мне верное направление?

0

Решение

Как MSDN говорит около CStdioFile по умолчанию в текстовом режиме:

Текстовый режим обеспечивает специальную обработку для возврата каретки — перевод строки
пар. Когда вы пишете символ новой строки (0x0A) в текстовом режиме
CStdioFile объект, пара байтов (0x0D, 0x0A) отправляется в файл.
Когда вы читаете, пара байтов (0x0D, 0x0A) транслируется в один
0x0A байт.

Итак, хотя ваше чтение выглядит нормально, потому что \n будет лишен перегрузки ReadString что вы используете, то вы добавили вручную \r\n правильно отображаться в элементе управления редактирования, однако при сохранении содержимого каждый \r\n будет объяснено \r\r\n как описано в цитате выше.

Решение состоит в том, чтобы удалить все \r символы из строки до писать в CStdioFileоставив только \n персонажи, и пусть CStdioFile вставить \r для тебя. Или, что намного проще, просто откройте файл в двоичном режиме, а не в текстовом режиме, чтобы подавить это преобразование:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]