0

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

4

1 に答える 1