Difference between revisions of "cpp/io/manip/unitbuf"
m (-whitespace) |
m (→Example: rm chrono's `.count()`) |
||
(10 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|unitbuf|nounitbuf}} | {{cpp/title|unitbuf|nounitbuf}} | ||
− | {{cpp/io/manip/ | + | {{cpp/io/manip/navbar}} |
− | {{ | + | {{dcl begin}} |
− | {{ | + | {{dcl header|ios}} |
− | {{ | + | {{dcl|num=1| |
std::ios_base& unitbuf( std::ios_base& str ); | std::ios_base& unitbuf( std::ios_base& str ); | ||
}} | }} | ||
− | {{ | + | {{dcl|num=2| |
std::ios_base& nounitbuf( std::ios_base& str ); | std::ios_base& nounitbuf( std::ios_base& str ); | ||
}} | }} | ||
− | {{ | + | {{dcl end}} |
Enables or disables automatic flushing of the output stream after any output operation. Has no effect on input. | Enables or disables automatic flushing of the output stream after any output operation. Has no effect on input. | ||
− | 1 | + | @1@ Enables the {{tt|unitbuf}} flag in the stream {{c|str}} as if by calling {{c|str.setf(std::ios_base::unitbuf)}}. |
− | 2 | + | @2@ Disables the {{tt|unitbuf}} flag in the stream {{c|str}} as if by calling {{c|str.unsetf(std::ios_base::unitbuf)}}. |
− | This is an I/O manipulator, it may be called with an expression such as {{ | + | This is an I/O manipulator, it may be called with an expression such as {{c|out << std::unitbuf}} for any {{tt|out}} of type {{lc|std::basic_ostream}} or with an expression such as {{c|in >> std::unitbuf}} for any {{tt|in}} of type {{lc|std::basic_istream}}. |
===Notes=== | ===Notes=== | ||
− | Flushing is performed in the destructor of the {{ | + | Flushing is performed in the destructor of the {{lc|std::basic_ostream::sentry}} object, which calls {{c|str.rdbuf()->pubsync()}} if {{c|str.flags() & std::ios_base::unitbuf}} is {{c|true}}. |
− | The standard output objects {{ | + | The standard output objects {{lc|std::cerr}} and {{lc|std::wcerr}} have their {{tt|unitbuf}} bit set by default. |
===Parameters=== | ===Parameters=== | ||
− | {{ | + | {{par begin}} |
− | {{ | + | {{par|str|reference to I/O stream}} |
− | {{ | + | {{par end}} |
===Return value=== | ===Return value=== | ||
− | + | {{c|str}} (reference to the stream after manipulation). | |
− | {{ | + | |
===Example=== | ===Example=== | ||
− | {{example | + | {{example |
− | + | |Without {{tt|std::unitbuf}} or another explicit flush, the output is the same, but does not appear in real time. | |
− | + | |code= | |
− | + | ||
#include <chrono> | #include <chrono> | ||
+ | #include <iostream> | ||
+ | |||
template<typename Diff> | template<typename Diff> | ||
void log_progress(Diff d) | void log_progress(Diff d) | ||
{ | { | ||
− | std::cout | + | std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) |
− | + | << " ... "; | |
− | << " | + | |
} | } | ||
+ | |||
int main() | int main() | ||
{ | { | ||
− | volatile int sink=0; | + | volatile int sink = 0; |
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) |
{ | { | ||
− | for(int n=0; n<10000; ++n) | + | for (int n = 0; n < 10000; ++n) |
− | 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= | |
− | .. | + | 571ms ... 1146ms ... 1722ms ... 2294ms ... 2865ms ... |
}} | }} | ||
===See also=== | ===See also=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc inc|cpp/io/manip/dsc flush}} |
− | {{ | + | {{dsc inc|cpp/io/manip/dsc endl}} |
− | {{ | + | {{dsc end}} |
+ | |||
+ | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
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) |