2

繰り返しになりますが、先生は私の質問に答えることができませんでした。私は誰ができるか知っていました...

ですから、私は C を実際に学んだことはありません。C++ では、明らかに、常に cout ステートメントを使用します。最近の課題で、私の先生は私たちに、必ず

setbuf( stdout , NULL );

バッファリングされていない出力を取得するために main() の上部にあるため、出力を適切に表示できます。

私の質問は次のとおりです。このステートメントは cout ステートメントに影響しますか、それとも単に私が呼び出す printf() ステートメントに影響しますか?

前もって感謝します!

4

3 に答える 3

5

デフォルトでは、stdout または cout がコンソールに出力される場合、出力は行バッファーされます。これは、印刷されるすべての改行が出力をフラッシュすることを意味します。出力がファイルにリダイレクトされ、 tail -f を使用し、リアルタイムで特定の出力が必要な場合に備えて、動作をオーバーライドしたいときはいつでも、明示的に flush() を呼び出すことができます。

Chris が言ったように、 sync_with_stdioはバッファリングされていない stdout をバッファリングされていない cout と結び付ける必要があります (デフォルト) 。すなわち:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

見るのが面白いかもしれない別の関数はtieです。

于 2008-10-01T06:09:48.630 に答える
5

デフォルトでは、iostream と stdio は同期されます。参照。

ただし、これは stdio バッファリングを手動で調整することが良い考えだという意味ではありません! std::endlまたはstd::flush(from )を使用<ostream>すると役立つ場合があります。例えば、

std::cout << "Hello, world!" << std::endl;

また

std::cout << "Hello, world!\n" << std::flush;

これらはどちらも同じことを行います。( std::endl= 終了行を出力してからフラッシュします。)

于 2008-10-01T05:20:48.403 に答える
1

通常、出力をすぐに確認することが重要な場合は、取引を実際に取引相手に送信する前にハード ドライブに記録する必要がある複雑で信頼性の高い金融ルーチンについて話します。または、(より一般的なケース) プログラムがクラッシュしている場合でもデバッグ メッセージを表示したい場合。

あなたは勉強中なので、2 番目のケースを扱っていると思います。その場合、stdout ではなく stderr を使用することをお勧めします。デフォルトではバッファリングされず、stdout とは別にリダイレクトして、出力を 1 つの場所に置き、ログを別の場所に置くことができます。

于 2008-10-01T13:57:29.067 に答える