fprintf
またはfwrite
. _ これが実装/プラットフォームに依存する機能である可能性があることを理解しています。私が興味を持っているのは、Windows、Linux、または Mac OS X などの最新の一般的なプラットフォームで少なくとも効率的に実装できると期待できるかどうかです。
私の知る限り、通常、I/O ルーチンのバッファリングは 2 つのレベルで行われます。
- ライブラリ レベル: これは、C 標準ライブラリ、または Java SDK (
BufferedOutputStream
) などです。 - OS レベル: 最新のプラットフォームは、I/O 操作をキャッシュ/バッファリングします。
私の質問は#2ではなく# 1に関するものです(私はそれがすでに真実であることを知っています)。言い換えれば、最新のすべてのプラットフォームの C 標準ライブラリの実装でバッファリングを利用できると期待できますか?
そうでない場合は、手動でバッファを作成し(巧妙に選択されたサイズで)、オーバーフロー時にそれをフラッシュすることが問題の良い解決策ですか?
結論
setbuf
やのような関数を指摘してくれた皆さんに感謝しますsetvbuf
。これらは、私の質問に答えるために探していた正確な証拠です。有用な抜粋:
ファイルが対話型デバイスを参照していないことがわかっている場合、すべてのファイルはデフォルトで割り当てられたバッファー ( full buffered ) で開かれます。この関数は、特定のメモリ ブロックをバッファとして使用するように設定するか、ストリームのバッファリングを無効にするために使用できます。
デフォルトのストリームは、インタラクティブなデバイスを参照していないことがわかっ
stdin
てstdout
いる場合、デフォルトで完全にバッファリングされます。それ以外の場合は、システムとライブラリの実装に応じて、デフォルトで行バッファーまたは非バッファーのいずれかになります。同じことが にも当てはまりstderr
ます。これは、デフォルトで常にライン バッファーまたは非バッファーのいずれかです。