C ++ IOストリームのどの部分\rを\r\n変換しますか?それ自体ですか、それともファセットstream_bufによる内部から外部へのエンコーディング変換の一部ですか?codecvt
更新1
あなたは皆、それがstreambuf/filebufで行われると言います。Ok。しかし、この配置は、たとえばUTF-16のような外部エンコーディングをどのように処理しますか?ios::binary次に、翻訳を無効にするフラグを付けてファイルを開く必要があるようです。
この変換は、(通常)stream、streambuf、またはファセットによって実行されません。fputc()streambufとによって呼び出されるのはCライブラリコード(例)overflow()の責任underflow()です。
何らかの理由で必要な場合(たとえば、dos2unixルーチンを実装する場合)、boost.iostreamsに便利な例があります。
編集:std::filebufテキストファイルのマルチバイトエンコーディングのみをサポートします。たとえば、UTF-8やGB18030、またはロケールが使用するものは何でも。UTF-16ファイルは、プレーンバイトストリーム(C ++ 11のcodecvt機能を備えたUTF-16として解釈できます)としてバイナリモードで開く必要があります。そうすると、行末は変換されません。
IFAIRはstreambuf実装で行われcodecvt、ロケール表現の詳細を処理するだけです。
ios :: binaryフラグなしで開かれている場合は、std::filebufによって実行されます。