Чтение wstring из файла.txt не печатается должным образом, но при записи обратно в файл все в порядке

Я читаю wstring из файла.txt, используя цикл while! Eof:

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

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

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

2 ответа

Решение

Решается путем чтения файла в двоичном виде и последующего преобразования в 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;

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

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

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

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

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

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

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

Другие вопросы по тегам