Difference between revisions of "cpp/io/manip/unitbuf"
Andreas Krug (Talk | contribs) m (fmt, @@, capitalized 1st letter, {{c}}, ., headers sorted, langlinks) |
m (→Example: rm chrono's `.count()`) |
||
Line 34: | Line 34: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | |Without std::unitbuf or another explicit flush, the output is the same, but does not appear in real time. | + | |Without {{tt|std::unitbuf}} or another explicit flush, the output is the same, but does not appear in real time. |
|code= | |code= | ||
#include <chrono> | #include <chrono> | ||
Line 42: | Line 42: | ||
void log_progress(Diff d) | void log_progress(Diff d) | ||
{ | { | ||
− | std::cout | + | std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) |
− | + | << " ... "; | |
− | << " | + | |
} | } | ||
Line 52: | Line 51: | ||
std::cout << std::unitbuf; // enable automatic flushing | std::cout << std::unitbuf; // enable automatic flushing | ||
− | auto | + | const auto start = std::chrono::high_resolution_clock::now(); |
for (int j = 0; j < 5; ++j) | for (int j = 0; j < 5; ++j) | ||
{ | { | ||
Line 58: | Line 57: | ||
for (int m = 0; m < 20000; ++m) | for (int m = 0; m < 20000; ++m) | ||
sink += m * n; // do some work | sink += m * n; // do some work | ||
− | + | log_progress(std::chrono::high_resolution_clock::now() - start); | |
− | + | ||
} | } | ||
std::cout << '\n'; | std::cout << '\n'; | ||
} | } | ||
|output= | |output= | ||
− | .. | + | 571ms ... 1146ms ... 1722ms ... 2294ms ... 2865ms ... |
}} | }} | ||
Latest revision as of 12:18, 16 September 2023
Defined in header <ios>
|
||
std::ios_base& unitbuf( std::ios_base& str ); |
(1) | |
std::ios_base& nounitbuf( std::ios_base& str ); |
(2) | |
Enables or disables automatic flushing of the output stream after any output operation. Has no effect on input.
This is an I/O manipulator, it may be called with an expression such as out << std::unitbuf for any out
of type std::basic_ostream or with an expression such as in >> std::unitbuf for any in
of type std::basic_istream.
Contents |
[edit] Notes
Flushing is performed in the destructor of the std::basic_ostream::sentry object, which calls str.rdbuf()->pubsync() if str.flags() & std::ios_base::unitbuf is true.
The standard output objects std::cerr and std::wcerr have their unitbuf
bit set by default.
[edit] Parameters
str | - | reference to I/O stream |
[edit] Return value
str (reference to the stream after manipulation).
[edit] Example
Without std::unitbuf
or another explicit flush, the output is the same, but does not appear in real time.
#include <chrono> #include <iostream> template<typename Diff> void log_progress(Diff d) { std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) << " ... "; } int main() { volatile int sink = 0; std::cout << std::unitbuf; // enable automatic flushing const auto start = std::chrono::high_resolution_clock::now(); for (int j = 0; j < 5; ++j) { for (int n = 0; n < 10000; ++n) for (int m = 0; m < 20000; ++m) sink += m * n; // do some work log_progress(std::chrono::high_resolution_clock::now() - start); } std::cout << '\n'; }
Output:
571ms ... 1146ms ... 1722ms ... 2294ms ... 2865ms ...
[edit] See also
flushes the output stream (function template) | |
outputs '\n' and flushes the output stream (function template) |