18

C では、ストリームをバッファなし I/O に簡単に設定できます。

FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );

C++ IOStreams を使用して、同様にバッファーなしの I/O を実現するにはどうすればよいですか?

4

1 に答える 1

30

ファイル ストリームの場合は、次のように使用できます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 )。

于 2013-05-17T09:19:12.607 に答える