質問

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

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

setbuf( stdout , NULL );

main()の上部で、バッファなしの出力を取得し、出力を適切に表示できるようにします。

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

事前に感謝します!

役に立ちましたか?

解決

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

これは、stdioバッファリングを手動で調整するのが良いアイデアであることを意味しません! std::endlまたはstd::flush<ostream>から)を利用したい場合があります。例:

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

または

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

これらは両方とも同じことをします。 ( <=> =エンドラインを印刷してからフラッシュします。)

他のヒント

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

Chrisが言ったように、 sync_with_stdio は、バッファされていない標準出力をバッファリングされていないcout(デフォルト)ですが、stdoutでsetbufを使用する代わりにcoutを使用している場合は、 pubsetbuf は、 rdbuf 。例:

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

もう1つの興味深い機能は、 tie です。

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

勉強しているので、2番目のケースを扱っていると仮定します。その場合、私のアドバイスはstdoutではなくstderrを使用することです。デフォルトではバッファリングされず、stdoutとは別にリダイレクトして、出力を1か所に、ロギングを別の場所に配置できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top