好奇心から、iostream が入出力システムにどのようにアクセスするのかを説明します。(私は常に車輪を再発明するという悪い癖があり、iostream のようなカスタム入出力システムを構築できるかどうか疑問に思っています)。
4 に答える
IOstream の詳細なガイドについては、本Standard C++ IOStreams and Localesを参照してください。これを読んだ後は、現状維持で満足していただけると思います。IOStream は、おそらく C++ 標準ライブラリの中で最も複雑な部分です。
場合によります...
何らかの方法で、オペレーティング システムのネイティブ IO システムとやり取りします。カーネルへのシステム コールを使用する C ライブラリを内部的に使用する場合もあれば、システム コールを直接使用する場合もあります。正確な実装は、プラットフォームに大きく依存します。
多くの人は車輪を再発明するなと言うでしょうが、それは良い学習体験になる可能性があります. Windows を使用している場合は、ファイル処理のための Win32 API 呼び出しを調べてください。Linux を使用している場合は、POSIX/C ライブラリを使用するか、システム コールを使用します (はるかに難しいため、C ライブラリを使用することをお勧めします)。
あなたは確かに車輪を再発明することができました.
国際文字セットを処理するために、ストリーム オペレータには多くの複雑な機能が追加されています。それをかなり深く見た後、私はそれをあまり気にしませんでした。これは非常に複雑で、継承を簡単に使用する可能性を完全に破壊します。それは動作し、利用可能です。(変換中に使用するストレージの動作を変更したかった)
すべてのストリームは streambuf に送られます。その streambuf は、ストリームのタイプによって異なります。オフストリームは fstreambuf に行きます。cout は、特定されていない streambuf に移動します。カスタマイズしたい場合は、cout を使用すると、この streambuf を取得して置き換えることができます。
一般的なパターンは、「filtering streambuf」です。これは、入力を別の streambuf に送信する前に変換する streambuf インターフェイスです。これは cout と組み合わせることができます: 元の streambuf を取り出し、それをフィルター処理する streambuf でラップし、そのラッパーを cout に戻します。元の streambuf がどのように機能するかを知る必要はありません。