Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable buffering on a stream?

In C, I can easily set a stream to unbuffered I/O:

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

How would I achieve similarly unbuffered I/O using C++ IOStreams?

like image 200
DevSolar Avatar asked May 17 '13 09:05

DevSolar


1 Answers

For file streams, you can use pubsetbuf for that :

std::ifstream f;
f.rdbuf()->pubsetbuf(0, 0);
f.open("test");


Explanation

The C++ standard says the following about the effect of setbuf (and thus pubsetbuf) for file streams :

If setbuf(0,0) is called on a stream before any I/O has occurred on that stream, the stream becomes unbuffered. Otherwise the results are implementation-defined. “Unbuffered” means that pbase() and pptr() always return null and output to the file should appear as soon as possible.

The first sentence guarantees that the above code makes the stream unbuffered. Note that some compilers (eg. gcc) see opening a file as an I/O operation on the stream, so pubsetbuf should be called before opening the file (as above).

The last sentence, however, seems to imply that that would only be for output, and not for input. I'm not sure if that was an oversight, or whether that was intended. Consulting your compiler documentation might be useful. For gcc eg., both input and output are made unbuffered (ref. GNU C++ Library Manual - Stream Buffers).

like image 132
Sander De Dycker Avatar answered Oct 15 '22 22:10

Sander De Dycker