いいえ、それは POSIXの動作ではなく、ISOの動作です(まあ、POSIXの動作ですが、ISOに準拠している場合に限ります)。
標準出力は、インタラクティブデバイスを参照するために検出できる場合はラインバッファリングされ、それ以外の場合は完全にバッファリングされます。したがってprintf
、次のように、送信する改行を取得してもフラッシュされない状況があります。
myprog >myfile.txt
ユーザーとやり取りしている場合、ユーザーはおそらくすべての行を確認する必要があるため、これは効率にとって意味があります。出力をファイルに送信する場合は、反対側にユーザーがいない可能性が高いです(不可能ではありませんが、ファイルをテーリングしている可能性があります)。ここで、ユーザーがすべてのキャラクターを見たいと思うかもしれませんが、それには2つの問題があります。
1つ目は、あまり効率的ではないということです。2つ目は、元のANSI Cの義務は、新しい動作を発明するのではなく、主に既存の動作をコード化することであり、それらの設計決定はANSIがプロセスを開始するずっと前に行われたということです。ISOでさえ、現在、標準の既存のルールを変更する際には非常に注意深く踏み込んでいます。
これに対処する方法についてはfflush (stdout)
、すべての出力呼び出しの後ですぐに確認したい場合は、問題が解決します。
または、をsetvbuf
操作する前にを使用してstdout
、それをバッファなしに設定fflush
し、コードにこれらすべての行を追加することを心配する必要はありません。
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
ちょうどあなたがあれば、パフォーマンスにかなりの影響を与えることを覚えておいてくださいされているファイルに出力を送信します。また、これに対するサポートは実装定義であり、標準では保証されていないことにも注意してください。
ISO C99セクション7.19.3/3
は関連ビットです:
ストリームがバッファリングされていない場合、文字はソースから、または宛先にできるだけ早く表示されるようになっています。そうしないと、文字が蓄積され、ホスト環境との間でブロックとして送信されます。
ストリームが完全にバッファリングされている場合、文字は、バッファがいっぱいになったときにブロックとしてホスト環境との間で送受信されることを目的としています。
ストリームがラインバッファリングされている場合、改行文字が検出されると、文字はブロックとしてホスト環境との間で送受信されます。
さらに、バッファがいっぱいになったとき、バッファリングされていないストリームで入力が要求されたとき、またはホスト環境からの文字の送信を必要とするラインバッファリングストリームで入力が要求されたときに、文字はブロックとしてホスト環境に送信されるように意図されています。 。
これらの特性のサポートは実装定義であり、setbuf
およびsetvbuf
関数を介して影響を受ける可能性があります。