According to to this post std::cout will automatically flush on \\n
when it is attached to an interactive device (e.g. a terminal window). Otherwise (e.g. when
Contrary to anon's (Apr 28 '09) answer, this behavior has nothing to do with the operating system or "console software."
C++'s <iostream>
streams are designed to be interoperable with C's <stdio.h>
streams. The goal is to allow uses of std::cout
to be intermixed with uses of printf
/puts
. To achieve this, std::cout
's streambuf
is implemented atop C's stdout
stream. It is actually C's stdout
that is line-buffered when the standard output is attached to a terminal device.
You can call std::ios_base::sync_with_stdio(false) (before your program uses any of C++'s standard I/O streams) to tell the C++ streams library to communicate directly with the underlying file descriptors rather than layering atop C's streams library. This avoids C's stdout
stream entirely and speeds up C++'s I/O streams at the cost of the two libraries no longer mixing well.
An alternative is to unconditionally set stdout
to fully buffered by calling std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ). Then, even though std::cout
is still writing through stdout
, you will not have stdout
flushing after every newline.
An implementation is free to flush whenever it feels it is appropriate. It varies from vendor to vendor whether they flush on \n
or not.
I can see something called ios_base& nounitbuf(ios_base& str);
from my C++0x draft. Give it a shot. This is about the only thing that standard C++ gives you.
This is not an issue with C++ (there is no language requirement that \n flushes anything) but with your operating system and/or console software. If the console wants to flush its buffer when it sees a newline, then it can, and I would guess that most do so. Note that it is important to differentiate between the C++ runtime's buffers (which can be to some extent controlled from your C++ code) and the buffers of the console application (over which it has no control).
FYI, there is a flag in the standard iostream library called unitbuf which if set causes the buffers to be flushed after each output operation. It is set, for example, for the std::cerr stream. This has nothing to do with the '\n' character however, as you can output multiple '\n' s in a single operation.