istreambuf_iterator
との違いは何istream_iterator
ですか?そして、一般的に、ストリームとストリームバフの違いは何ですか?これについての明確な説明が本当に見つからないので、ここで尋ねることにしました。
2 に答える
IOstream は、streambufs を入力/出力のソース/ターゲットとして使用します。事実上、streambuf ファミリは IO に関するすべての作業を行い、IOstream ファミリは書式設定と文字列へ/文字列からの変換にのみ使用されます。
ここでistream_iterator
、streambuf からのフォーマットされていない文字列シーケンスをフォーマットする必要があることを示すテンプレート引数を取ります。たとえば、 (空白で区切られた) すべての受信テキストをsistream_iterator<int>
として解釈します。int
一方、istreambuf_iterator
生の文字のみを考慮し、istream
渡された関連するストリームバッファを直接反復処理します。
通常、未加工の文字のみに関心がある場合は、istreambuf_iterator
. フォーマットされた入力に興味がある場合は、istream_iterator
.
私が言ったことはすべて と にも当てはまりostream_iterator
ますostreambuf_iterator
。
これは非常によく守られていない秘密です: iostream自体は、実際にコンピュータ上のファイルを読み書きすることとはほとんど関係がありません。
iostream は基本的に、streambuf とロケールの間の「仲人」として機能します。
iostream は、変換がどのように行われる必要があるかについての状態 (たとえば、変換の現在の幅と精度) を格納します。それらを使用して、変換を行う方法と場所をロケールに指示します (たとえば、この数値をそのバッファー内の幅 8 で精度 5 の文字列に変換します)。
あなたはそれについて直接尋ねませんでしたが、そのロケールは実際には単なるコンテナですが、(奇妙なことに) タイプセーフな異種コンテナです。含まれるものはfacet
s. ファセット オブジェクトは、ロケール全体の単一のファセットを定義します。標準では、数字の読み書き ( num_get
、num_put
) から文字の分類 (ctype ファセット) まで、あらゆるものに対して多数のファセットが定義されています。
デフォルトでは、ストリームは「C」ロケールを使用します。これは非常に基本的なものです。数字は数字のストリームとして変換されるだけで、文字として認識されるのは 26 個の小文字と 26 個の大文字の英字だけです。ただし、imbue
選択した別のロケールでストリームすることはできます。文字列で指定された名前によって、使用するロケールを選択できます。特に興味深いのは、空の文字列によって選択されたものです。空の文字列を使用すると、基本的に、ユーザーがオペレーティング システムをどのように構成したかに基づいて、最も適切であると "考える" ロケールを選択するようにランタイム ライブラリに指示します。これにより、コードは、特定のロケール用に明示的に記述しなくても、ローカライズされた形式でデータを処理できます。
istream_iterator
つまり、anと anの基本的な違いはistreambuf_iterator
、istreambuf_iterator から出力されるデータはロケールによって行われた (ほとんどの) 変換を経ていないが、an から出力されるデータはロケールistream_iterator
によって変換されているということです。
価値があるのは、前の段落の「ほとんど」は、istreambuf から (イテレーターまたはその他の方法で) データを読み取るときに、ロケールベースの変換が少し行われるという事実を指しています。これは、外部表現から内部表現 (UTF-8 から UTF-32 など) に変換するために使用されるものです。
両方ともロケールに格納されているという事実を無視し、関連する個々のファセットのみを考えた方が理にかなっている場合があります。
istream_iterator
これが aと anの本当の違いistreambuf_iterator
です。いずれかからのデータに対して少しの変換が (少なくとも可能性として) 行われますが、istreambuf_iterator
.