2017-12-18 70 views
5

coutバッファされたストリームです。これは、データがバッファに書き込まれ、ストリームがフラッシュされたときに印刷される、プログラムが終了するか、バッファが完全に充填されたときことを意味します。なぜすぐに出力されますか?

私はこれがどのように機能するかをテストするための小さなプログラムを作ったが、それは上記のいずれかの条件が満たされても、前に印刷し、なぜ私は理解していません。

#include <iostream> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    cout << "Test"; 
    float secs = 5; 
    clock_t delay = secs * CLOCKS_PER_SEC; 
    clock_t start = clock(); 
    while (clock() - start < delay) { } 
    return 0; 
} 

実行すると、ループが開始する前に「テスト」が出力されます。プログラムが終了するまで

はなぜ私の出力がバッファリングされていませんか?

+2

印刷する前に 'std :: ios :: sync_with_stdio(false);'を試してください。 – scohe001

+1

std :: ios :: sync_with_stdio(false);ありがとう!しかし、なぜ? –

+0

下記の私の答えを見てください – scohe001

答えて

4

これについてはhere以上の議論があります。

の答えの1から:

すべてのC++ストリームはバッファリングを実行するために関連付けられたストリームバッファオブジェクトを使用しています。

std::coutが構築された場合、<cstdio>で宣言されたオブジェクトstdoutに関連付けられたストリームバッファを使用します。デフォルトで は、std::coutの操作はstd::printf()<cstdio>出力機能と自由に混合することができます。

実際には、同期は通常、標準のiostreamオブジェクトと標準のstdioオブジェクトがバッファを共有することを意味します。 -IS

std::ios_base::sync_with_stdio(false)が呼び出された場合(標準ストリームの入力または出力操作の前)、標準のC++ストリームは標準のCストリームとは独立して動作します(つまり、それぞれ別のストリームバッファに切り替わります)。

詳細については、sync_with_stdio機能参照ページcppreferenceを参照してください。標準C++のストリームは、標準Cに同期されているかどうか、そのページ、関数から

...

セットは、各入力/出力操作の後にストリーム。

...実際には、これは同期C++ストリームがバッファなしであり、C++ストリームの各I/O動作が直ちに対応するCストリームのバッファに適用されることを意味します。これにより、C++とC/Oを自由に混在させることができます。

しかし、すでにそこにあったの読み取りまたは書き込みをした後にこの関数を呼び出すには注意してください:I/Oが標準ストリーム上で発生した後にこの関数が呼び出され

場合、動作は実装定義であります実装は、効果がない状態から読み取りバッファを破棄する状態までの範囲です。

2

また、別の素晴らしい会話hereもあります。これはscohe001が言及したことのいくつかに関連しているようですが、少し違うので、私はそれを自分の答えに入れます。

上記の回答は、他の周辺のコードに応じてバッファがどのようにフラッシュされるかについて説明しているフォーラムに投稿されているthisです。 Std :: cout関数は他のストリーム関数と結びついており、通常のcライブラリ関数はscohe001のように記述されています。したがって、何かが呼び出されて、それが束縛されている場合、そのバッファはフラッシュされてから続行されます。

gccでこれをLinuxでコンパイルしているのですか、それともいくつかのWindows環境でこれを実行していますか?このポストhereは、上記のフォーラムからOS固有の機能について説明しています。また、ウィンドウからのsleep()によってバッファがフラッシュされる可能性があります。さもなければ、通常のgccコンパイル済みのC++コードは、sleep()を使用してバッファを印刷しないので、続行する前にバッファをフラッシュする他のコードに遭遇していない限りです。

上記の投稿には多くの情報が含まれていますので、ここではコピーして貼り付けることを控えていますので、私を許してください。

この情報が役立つことを願っています!

関連する問題