2016-06-01 2 views
0

Я читаю wstring из текстового файла, используя некоторое время ВФ цикла:wstring чтения из текстового файла не печатается правильно, но когда записывается обратно в файл, это нормально

std::wifstream fileStream(path); 
std::wstring input; 
while (fileStream.eof() == false) { 
getline(fileStream, input); 
text += input + L'\n'; 
} 

Но когда Я печатаю его в wcout, некоторые символы превращаются в другие. До сих пор č превратился в e (с обратной запятой в ontop), от ě до i (с обратной запятой) и š к символу ошибки. Сначала я подозревал какую-то проблему с форматом. Но когда я пишу строку в новый .txt-файл, все в порядке.

Также я использую _setmode(_fileno(stdout), _O_U8TEXT);, чтобы заставить wcout работать даже.

+0

Является ли ваша платформа Windows? Если бы вы установили правильную кодовую страницу? Если ваш терминал правильно не поддерживает Unicode? Вы посмотрели фактическое содержимое строки в отладчике, чтобы убедиться, что они были правильными? –

+0

Да. Я не знаю, как его обнаружить из файлов .txt, которые я читаю. Стандартный Windows/VS терминал не поддерживает юникод. И нет, они были неверны в отладчике. –

ответ

0

решаемые чтение файла как двоичный, а затем преобразование в wstring с помощью функции MultiByteToWideChar из win32 API:

std::ifstream fileStream(path, std::ios::binary | std::ios::ate); 
auto size = fileStream.tellg(); 
fileStream.seekg(0, std::ios::beg); 

LPCCH memory = new CCHAR[size]; 

fileStream.read((char*)memory, size); 

text.resize(size); 
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, memory, size, (LPWSTR)text.c_str(), text.length()); 
delete[] memory; 
-1

Я не знаю, если это является причиной вашей проблемы, но ...

Если вы пишете

while (fileStream.eof() == false) { 
getline(fileStream, input); 
text += input + L'\n'; 
} 

Читает два раза в последней строке, потому что filestream.eof() является false, пока вы не попытаетесь прочитайте последнюю строку.

Я предлагаю вам что-то вроде

while (getline(fileStream, input)) 
    text += input + L'\n'; 

PS: Извините за мой плохой английский

+0

О, спасибо. Но, к сожалению, это не решило мою проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^