更新:感谢@Potatoswatter 和@Jonathan Leffler 的评论 - 令人尴尬的是,我被调试器工具提示发现没有正确显示 wstring 的值 - 但是它仍然对我不太有效,我已经更新了问题以下:
如果我有一个小的多字节文件,我想读入一个字符串,我使用以下技巧 - 我使用例如getline
分隔符'\0'
std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '\0');
这会读入整个文件,包括换行符。
但是,如果我尝试对宽字符文件做同样的事情,它就不起作用——我wstring
只读取第一行。
std::wstring contents_wide;
std::wifstream inf2(L"ucs2-be.txt");
getline( inf2, contents_wide, wchar_t(0) ); //doesn't work
例如,如果我的 unicode 文件包含由 CRLF 分隔的字符 A 和 B,则十六进制如下所示:
FE FF 00 41 00 0D 00 0A 00 42
基于使用 '\0' 的多字节文件 getline 读取整个文件的事实,我认为getline( inf2, contents_wide, wchar_t(0) )
应该读取整个 unicode 文件。然而事实并非如此——在上面的例子中,我的宽字符串将包含以下两个 wchar_ts:FF FF
(如果我删除 wchar_t(0) 它会按预期在第一行中读取(即FE FF 00 41 00 0D 00
)
为什么 wchar_t(0) 不能用作分隔 wchar_t 以便 getline 停止00 00
(或读取到我想要的文件末尾)?
谢谢