2014-01-13 1 views
0

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

все это работает довольно много штраф и денди за то, что я хочу, но проблема заключается в том, что он добавляет символ блока после слова, если я удалю символ в поле редактирования, а затем нажмите кнопку обновления. иногда он даже добавляет блок после каждого слова и одного блока на каждую пустую строку. он отлично работает, пока он создает новый файл, и ничего не удаляется. Я пробовал отменять null, я пробовал ccs="encoding". Может кто-то указать мне верное направление?

+0

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

+0

Просто интересно, если вы включили ES_MULTILINE для элемента управления редактирования – cha

+0

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

ответ

1

Как MSDN says о 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(); 
+0

Проблема, с которой я сталкиваюсь с использованием 'CFile :: typeBinary', заключается в том, что чтение тогда отображает только 1 символ в элементе управления редактирования (в файле это нормально и не создает никаких полей). ну, если я также не прочитал его с помощью 'CFILE :: typeBinary', но тогда я получаю ту же проблему, что и раньше, с лишними символами поля. Я также пытался удалить символы '\ r' перед тем, как писать, но это тоже не помогло. хотя, я думаю, мне, возможно, придется продолжить работу над этим методом на всякий случай, если я не сделаю это правильно.я отправлю сообщение, если я все еще не смогу это понять. Спасибо за помощь. – user3179762

+0

@ user3179762 То, что я имел в виду, заключалось в том, чтобы * читать * это так же, как сейчас, но просто установить в двоичный код для * записи * из строки, которую вы уже исправили, чтобы иметь разделители '\ r \ n'. –

+0

, когда я оставляю чтение как я это делаю сейчас, а затем пишу с помощью двоичного набора, тогда он отображает только один символ в элементе управления редактированием. – user3179762