0

我正在使用 while !eof 循环从 .txt 文件中读取 wstring:

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);用来让 wcout 工作。

4

2 回答 2

0

通过将文件读取为二进制文件然后使用 win32 api 中的 MultiByteToWideChar 函数转换为 wstring 来解决:

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;
于 2016-06-02T15:27:33.403 回答
-1

我不知道这是否是您的问题的原因,但是...

如果你写

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

filestream.eof()您阅读了最后一行的两倍,因为false直到您尝试阅读最后一行。

我建议你像

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

ps:对不起我的英语不好

于 2016-06-01T16:57:56.680 回答