Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/io/manip/unitbuf"

From cppreference.com
< cpp‎ | io‎ | manip
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/sidebar}}
+
{{cpp/io/manip/navbar}}
{{ddcl list begin}}
+
{{dcl begin}}
{{ddcl list header|ios}}
+
{{dcl header|ios}}
{{ddcl list item | num = 1|
+
{{dcl|num=1|
 
std::ios_base& unitbuf( std::ios_base& str );
 
std::ios_base& unitbuf( std::ios_base& str );
 
}}
 
}}
{{ddcl list item | num = 2|
+
{{dcl|num=2|
 
std::ios_base& nounitbuf( std::ios_base& str );
 
std::ios_base& nounitbuf( std::ios_base& str );
 
}}
 
}}
{{ddcl list end}}
+
{{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) enables the {{tt|unitbuf}} flag in the stream {{tt|str}} as if by calling {{cpp|str.setf(std::ios_base::unitbuf)}}
+
@1@ Enables the {{tt|unitbuf}} flag in the stream {{c|str}} as if by calling {{c|str.setf(std::ios_base::unitbuf)}}.
  
2) disables the {{tt|unitbuf}} flag in the stream {{tt|str}} as if by calling {{cpp|str.unsetf(std::ios_base::unitbuf)}}
+
@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 {{cpp|out << std::unitbuf}} for any {{tt|out}} of type {{cpp|std::basic_ostream}} or with an expression such as {{cpp|in >> std::unitbuf}} for any {{tt|in}} of type {{cpp|std::basic_istream}}.
+
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 {{cpp|std::basic_ostream::sentry}} object, which calls {{cpp|out.rdbuf()->pubsync()}} if {{cpp|1=out.flags() & std::ios_base::unitbuf == true}}.
+
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 {{cpp|std::cerr}} and {{cpp|std::wcerr}} have their {{tt|unitbuf}} bit set by default.
+
The standard output objects {{lc|std::cerr}} and {{lc|std::wcerr}} have their {{tt|unitbuf}} bit set by default.
  
 
===Parameters===
 
===Parameters===
{{param list begin}}
+
{{par begin}}
{{param list item | str | reference to I/O stream }}
+
{{par|str|reference to I/O stream}}
{{param list end}}
+
{{par end}}
  
 
===Return value===
 
===Return value===
 
+
{{c|str}} (reference to the stream after manipulation).
{{tt|str}} (reference to the stream after manipulation)
+
  
 
===Example===
 
===Example===
{{example cpp
+
{{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 <iostream>
+
 
#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)
              << std::chrono::duration_cast<std::chrono::milliseconds>(d).count()
+
               << " ... ";
               << " ms)..";
+
 
}
 
}
 +
 
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 t1 = std::chrono::high_resolution_clock::now();
+
     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
         auto now = std::chrono::high_resolution_clock::now();
+
         log_progress(std::chrono::high_resolution_clock::now() - start);
        log_progress(now - t1);
+
 
     }
 
     }
 
     std::cout << '\n';
 
     std::cout << '\n';
 
}
 
}
| output=
+
|output=
..(450 ms)....(902 ms)....(1352 ms)....(1802 ms)....(2252 ms)..
+
571ms ... 1146ms ... 1722ms ... 2294ms ... 2865ms ...
 
}}
 
}}
  
 
===See also===
 
===See also===
{{dcl list begin}}
+
{{dsc begin}}
{{dcl list template | cpp/io/manip/dcl list flush}}
+
{{dsc inc|cpp/io/manip/dsc flush}}
{{dcl list template | cpp/io/manip/dcl list endl}}
+
{{dsc inc|cpp/io/manip/dsc endl}}
{{dcl list end}}
+
{{dsc end}}
 +
 
 +
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}

Latest revision as of 12:18, 16 September 2023

 
 
 
Input/output manipulators
Floating-point formatting
Integer formatting
Boolean formatting
Field width and fill control
Other formatting
Whitespace processing
Output flushing
(C++20)  

unitbufnounitbuf
Status flags manipulation
Time and money I/O
(C++11)
(C++11)
(C++11)
(C++11)
Quoted manipulator
(C++14)
 
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.

1) Enables the unitbuf flag in the stream str as if by calling str.setf(std::ios_base::unitbuf).
2) Disables the unitbuf flag in the stream str as if by calling str.unsetf(std::ios_base::unitbuf).

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) [edit]
outputs '\n' and flushes the output stream
(function template) [edit]