Can I stop std::cout flushing on “\n”?

后端 未结 3 1990
感动是毒
感动是毒 2020-12-06 07:21

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

相关标签:
3条回答
  • 2020-12-06 07:59

    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.

    0 讨论(0)
  • 2020-12-06 08:00

    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.

    0 讨论(0)
  • 2020-12-06 08:01

    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.

    0 讨论(0)
提交回复
热议问题