当我遇到一个奇怪的行为时,我正在玩std::wstring
and 。std::wfstream
即,似乎std::basic_string<wchar_t>::find
无法找到某些字符。考虑以下代码:
int main()
{
std::wifstream input("input.txt");
std::wofstream output("output.txt");
if(!(input && output)){
std::cerr << "file(s) not opened";
return -1;
}
std::wstring buf;
std::getline(input, buf);
output << buf;
std::cout << buf.find(L'ć');
}
在这里,我只是读取文件的第一行input
并将其写入output
文件。程序运行前,第一个文件的内容aąbcćd
为空,输出文件为空。执行代码后,输入文件成功复制到输出文件中。
令我惊讶的是,我试图在 中找到ć
一封信buf
并遇到了提到的奇怪行为。程序执行后,我确认输出文件中包含的正是aąbcćd
,其中显然包含了提到的字符ć
。
然而,这条线的std::cout << buf.find(L'ć')
表现并不像预期的那样。4
考虑到 的内存布局,我没想到会得到 的输出std::wstring
,但我也绝对没想到会得到std::string::npos
。值得一提的是,用这种方法查找常规 ASCII 字符是成功的。
综上所述,上述代码正确地将输入文件的第一行复制到输出文件,但它未能在字符串中找到一个字符(返回 npos),该字符负责保存要复制的数据。为什么呢?是什么导致find
这里失败?
注意:这两个文件在 Windows 上都是 UTF-8 编码的。