моя программа имеет два блока управления редактированием, которые отображают текст из текстового файла, и у них обоих есть связанные с ними кнопки, которые обновляют текстовые файлы, связанные с ними, если что-либо записывается или удаляется в полях управления для редактирования. у меня есть этот код для чтения из текстового файла
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"
, Может кто-то указать мне верное направление?
Как 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 ();
Других решений пока нет …