当我遇到一个奇怪的行为时,我正在玩std::wstringand 。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 编码的。