2017-11-05 35 views
4

私はiostreamオブジェクトについて学習し、バッファをフラッシュしています。私は、出力バッファがフラッシュされることが保証され、明示的にバッファをフラッシュする方法を知っています。しかし、私は、出力バッファがでなく、がフラッシュされたケースを見たことがありません。 endl,flushendsなどのマニピュレータを使用しなくても、出力バッファが各文の最後にフラッシュされるようです。出力バッファがフラッシュされないケース?

出力バッファがフラッシュされない(または少なくともしばしば)フラッシュされるという簡単な例がありますか?出力バッファを実際に理解するためには、このようなケースが必要なような気がします。

+1

バッファリングとフラッシングの2つのレベルが含まれていることに留意してください。デフォルトではcoutに変わった上流オブジェクトのバッファリングと、OSのストリームのバッファリング。 – MikeMB

+0

@MikeMB 'cout'はバッファリングがオフになっていますか?あなたは 'unitbuf'を意味しますか?そうでない場合は、私はそれをオンにすることができますか? –

+0

['std :: ios :: sync_with_stdio(false)'](http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio) – MikeMB

答えて

3

システムによって異なります。

は、一例として、次のプログラムを取る:

#include <iostream> 
#ifdef WIN32 
#include <windows.h> 
#define sleep(n) Sleep((n)*1000) 
#else 
#include <unistd.h> 
#endif 

using namespace std; 

int main() 
{ 
    cout << "This is line 1"; 
    sleep(4); 
    cout << endl; 
    cout << "This is line 2" << endl; 

    return 0; 
} 

プログラムを検査することで、あなたがプログラムは、その後、4秒間一時停止This is line 2を印刷した後、This is line 1を印刷するであろうと推測することがあります。

Windowsで実行するようにVisual Studioでコンパイルすると、その動作が正しく行われます。

ただし、Linuxおよび他のUnixオペレーティングシステムでは、プログラムは4秒間サイレント状態になっているため、両方の行を一緒に印刷します。新しい出力文字が出力ストリームで検出されるまで、出力は確実にフラッシュされません。

+0

ああ、システムによって異なります。だから私はVisual Studioを使っているので、私はそのようなケースを見たことがないのです。ありがとう! –

+1

"出力ストリームで改行文字が検出されるまで、出力は確実にフラッシュされません"ということはまったく正しいことではありません。改行 '\ n'はフラッシュを行いませんが、' std :: endl'は改行を出力してから 'std :: flush'を実行するので、' std :: endl'は行いません。 'std :: endl'がかなり高価な場合があります。なぜなら、フラッシュが明示的に必要/望まれない限り、' \ n'を使う方が好きな理由です - この場合、 'std :: endl'は正しいツールです。 –

+2

@ JesperJuhl:std :: coutとfilestreamsを区別し、OS /コンソールウィンドウでバッファリングすることでiostreamオブジェクトを埋め込み、バッファリングする必要があります。デフォルトでは、std :: coutは何もバッファリングしませんが、各入力をosに直接(例えばLinuxの 'write 'を介して)送信し、通常は改行文字(またはそれ以前)を受け取ったときに自身のバッファをフラッシュします。このモードでは、 '\ n'と' std :: endl'の使用にほとんど違いはありません。 iostreamオブジェクト内でバッファリングを有効にする(またはファイルストリームを使用する)場合は、完全に正しい – MikeMB

関連する問題