I understand that by default all stream IO supported by C++ is buffered.
This means that data to be output is put into a buffer till it is full and then sent to the output device, similarly for input, the data is read once the buffer is empty...all this is done so that number of expensive system calls could be minimized.
But how to verify this behavior in action. I mean consider the following code
int main()
{
cout << "Hello world\n";
return 0
}
Where does buffering come into picture here ? I know there is buffering happening, but how to explain it? The output is seen instantly on the screen, so what could be a code example to actually see buffered I/O in action ?
Try the following program. sleep(1)
is used to introduce delay(1 second), I'm using linux, so sleep
works for me. If you can't make it work, try other ways to delay this program(for example, simple for
loop). You may also try increasing buffer size(uncomment commented lines of code) if you don't see any buffering effect.
On my OS(Linux 3.2.0
) and compiler(g++ 4.6.3
), this program prints "Portion1Portion2" then "Portion3Portion4" and then "Portion5". std::endl guaranteed to flush buffer, but as you can see, newline character also works this way for me.
#include <iostream>
#include <unistd.h>
using namespace std;
int main () {
// Try uncommenting following lines to increase buffer size
// char mybuf[1024];
// cout.rdbuf()->pubsetbuf(mybuf, 1024);
cout << "Portion1";
sleep(1);
cout << "Portion2\n";
sleep(1);
cout << "Portion3";
sleep(1);
cout << "Portion4" << endl;
sleep(1);
cout << "Portion5" << endl;
sleep(1);
cout << "Done!" << endl;
return 0;
}