あなたの本はあまり役に立たないようです。
1) 出力ストリームは、バイトを に送信しますstd::streambuf。これにはバッファが含まれる場合があります。および によって使用される (から派生した)はstd::filebuf、通常、バッファリングされます。つまり、文字を出力しても、すぐに出力されるとは限りません。これはバッファーに書き込まれ、バッファーがいっぱいになった場合にのみ OS に出力されます。または、通常
はストリームを呼び出すことによって (直接または間接的に を使用して)、何らかの方法で明示的に要求します。ただし、これは異なる場合があります。への出力は と同期され
、ほとんどの実装は多かれ少なかれ
forの規則に従い、出力が対話型デバイスに送られる場合はバッファリング戦略を変更します。streambufstd::ofstreamflush()std::endlstd::coutstdoutstdoutstd::cout
いずれにせよ、確信が持てず、出力が実際にプログラムを離れることを確認したい場合は、flush の呼び出しを追加するだけです。
2) あなたの本はここで間違っています。
バッファリング戦略の 1 つは次のとおりですunitbuf。std::ostreamこれは、設定またはリセットできるのフラグ
です (std::ios_base::set()および
std::ios_base::unset()—std::ios_baseは の基底クラスで
std::ostreamあるため、オブジェクトでこれらの関数を呼び出すことができstd::ostream
ます)。unitbufが設定されている場合
、すべての出力関数の最後にへのstd::ostream呼び出しが追加されるため、次のように記述します。flush()
std::cerr << "hello, world";
が設定されている場合、文字列内のすべての文字が出力された後、ストリームはフラッシュunitbufされます。起動時に、unitbufに設定されstd::cerrます。デフォルトでは、他のファイルには設定されていません。ただし、必要に応じて自由に設定または設定解除できます。on の設定を解除しないことをお勧めしますがstd::cerr、 がインタラクティブなデバイスに出力している場合std::coutは、そこに設定するのが非常に理にかなっています。
ここで問題になっているのは、streambuf. 通常、OS もバッファリングします。バッファが行うすべてのフラッシュは、文字を OS に転送することです。ofstreamこの事実は、トランザクションの整合性が必要な場合に直接使用できないことを意味します
。
3) を使用して文字列または文字バッファに入力する>>と、
std::istream最初に先頭の空白がスキップされ、次の空白まで入力されますが、次の空白は含まれません。標準の正式な用語では、ストリームから文字を「抽出」するため、それらが再び表示されることはありません(ストリームがサポートしている場合は、シークしない限り)。次の入力は、前の入力が中断されたところからピックアップされます。次の文字がバッファにあるか、ディスク上にあるかは、実際には関係ありません。
入力のバッファリングは、いくつかの異なるレベルで発生し、OS レベルでは、デバイスに応じて異なる形式をとるという点で、やや複雑であることに注意してください。通常、OS はファイルをセクターごとにバッファリングし、多くの場合、事前にいくつかのセクターを読み取ります。OS は、ファイルの終わりに遭遇しない限り、常に要求された数の文字を返します。ほとんどの OS は、キーボードを行単位でバッファリングします。つまり、行全体が入力されるまで読み取り要求から返されず、読み取り要求で現在の行の終わりを超えて文字が返されることはありません。
出力に
std::ostreama を使用するのと同じ方法で、 1 を使用して個々の文字を取得します。の場合、通常は;になります。が
文字を要求すると、バッファに文字がある場合はバッファから文字が返されます。そうでない場合は、OS から 512 文字 (またはそのバッファ サイズが何であれ) を要求して、バッファを補充しようとします。上記のように、デバイスのバッファリング ポリシーに従って応答します。streambufstd::istreamstd::cinfilebufistreamfilebuf
いずれにせよstd::cin、 がキーボードに接続されていて、 を入力した場合、入力"hello world"したすべての文字が最終的にストリームによって読み取られます。(ただし、 を使用している場合>>は、表示されない空白がたくさんあります。)