从.txt文件读取的wstring打印不正确,但是当写回文件时没关系

时间:2016-06-01 16:47:31

标签: c++ wifstream

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

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

但是当我在wcout中打印它时,一些角色会变成其他角色。到目前为止,č已经转向e(在顶部有一个向后的逗号),to到i(在顶部有一个向后的逗号)和š到一个错误字符。首先我怀疑是一些格式问题。但是当我将字符串写入新的.txt文件时,它完全没问题。

此外,我正在使用_setmode(_fileno(stdout), _O_U8TEXT);让wcout工作。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-1)

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

如果你写

# Clone the repo
RUN rm -rd /var/www/html
ENTRYPOINT git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/Laravel /var/www/html
# Set file permissions
ENTRYPOINT chmod -R 777 /var/www/html/storage 
ENTRYPOINT chmod -R 777 /var/www/html/bootstrap/cache

您在最后一行读了两遍,因为 while (fileStream.eof() == false) { getline(fileStream, input); text += input + L'\n'; } filestream.eof(),直到您尝试读取最后一行。

我建议你这样的事情

false

p.s:抱歉我的英语不好