と で遊んでいるstd::wstring
と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 でエンコードされています。