C では、ストリームをバッファなし I/O に簡単に設定できます。
FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );
C++ IOStreams を使用して、同様にバッファーなしの I/O を実現するにはどうすればよいですか?
ファイル ストリームの場合は、次のように使用できますpubsetbuf
。
std::ifstream f;
f.rdbuf()->pubsetbuf(0, 0);
f.open("test");
C++ 標準では、ファイル ストリームのsetbuf
(したがって)の効果について次のように述べています。pubsetbuf
setbuf(0,0)
ストリームで I/O が発生する前に が呼び出されると、ストリームはバッファリングされなくなります。それ以外の場合、結果は実装定義です。「バッファなし」とはpbase()
、pptr()
常に null を返し、ファイルへの出力ができるだけ早く表示されることを意味します。
最初の文は、上記のコードがストリームをバッファリングしないことを保証します。一部のコンパイラ (gcc など) は、ファイルを開くことをストリーム上の I/O 操作と見なすためpubsetbuf
、ファイルを開く前に呼び出す必要があることに注意してください (上記のように)。
ただし、最後の文は、それは出力用であり、入力用ではないことを暗示しているようです。それが見落としだったのか、それとも意図したものだったのかはわかりません。コンパイラのドキュメントを参照すると役立つ場合があります。たとえば gcc の場合、入力と出力の両方がバッファリングされません (参照: GNU C++ Library Manual - Stream Buffers )。