Чтение 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: извините за мой плохой английский