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.