std::unitbuf, std::nounitbuf
| Definiert in Header <ios> |
||
| std::ios_base& unitbuf( std::ios_base& str ); |
(1) | |
| std::ios_base& nounitbuf( std::ios_base& str ); |
(2) | |
Aktiviert oder deaktiviert das automatische Leeren des Ausgabestreams nach jeder Ausgabeoperation. Hat keine Auswirkung auf die Eingabe.
unitbuf im Stream str, als ob str.setf(std::ios_base::unitbuf) aufgerufen würde.unitbuf im Stream str, als ob str.unsetf(std::ios_base::unitbuf) aufgerufen würde.Dies ist ein I/O-Manipulator. Er kann mit einem Ausdruck wie out << std::unitbuf für jedes out vom Typ std::basic_ostream oder mit einem Ausdruck wie in >> std::unitbuf für jedes in vom Typ std::basic_istream aufgerufen werden.
Inhalt |
[bearbeiten] Hinweise
Das Leeren erfolgt im Destruktor des std::basic_ostream::sentry-Objekts, das str.rdbuf()->pubsync() aufruft, wenn str.flags() & std::ios_base::unitbuf true ist.
Die Standard-Ausgabeobjekte std::cerr und std::wcerr haben ihr unitbuf-Bit standardmäßig gesetzt.
[bearbeiten] Parameter
| str | - | Referenz auf einen E/A-Stream. |
[bearbeiten] Rückgabewert
str (Referenz auf den Stream nach der Manipulation).
[bearbeiten] Beispiel
Ohne std::unitbuf oder ein anderes explizites Leeren ist die Ausgabe dieselbe, erscheint aber nicht in Echtzeit.
#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'; }
Ausgabe
571ms ... 1146ms ... 1722ms ... 2294ms ... 2865ms ...
[bearbeiten] Siehe auch
| Spült den Ausgabestrom (Funktion-Template) | |
| Gibt '\n' aus und spült den Ausgabestrom (Funktion-Template) |