Difference between revisions of "cpp/io/manip/endl"
Andreas Krug (Talk | contribs) m (fmt, {{c}}, http -> https, headers sorted) |
m (Fix C++ Core Guidelines link) |
||
(One intermediate revision by one user not shown) | |||
Line 11: | Line 11: | ||
===Notes=== | ===Notes=== | ||
− | This manipulator may be used to produce a line of output immediately, e.g. when displaying output from a long-running process, logging activity of multiple threads or logging activity of a program that may crash unexpectedly. An explicit flush of {{lc|std::cout}} is also necessary before a call to {{lc|std::system}}, if the spawned process performs any screen I/O.<!--couldn't reproduce in VS2013, did it change? ---- (a common example is {{c|std::system("pause")}} on Windows).--> In most other usual interactive I/O scenarios, {{tt|std::endl}} is redundant when used with {{lc|std::cout}} because any input from {{lc|std::cin}}, output to {{lc|std::cerr}}, or program termination forces a call to {{c|std::cout.flush()}}. Use of {{tt|std::endl}} in place of {{c|'\n'}}, encouraged by some sources, may significantly degrade output performance. | + | This manipulator may be used to produce a line of output immediately, e.g. when displaying output from a long-running process, logging activity of multiple threads or logging activity of a program that may crash unexpectedly. An explicit flush of {{lc|std::cout}} is also necessary before a call to {{lc|std::system}}, if the spawned process performs any screen I/O.<!--couldn't reproduce in VS2013, did it change? ---- (a common example is {{c|std::system("pause")}} on Windows).--> In most other usual interactive I/O scenarios, {{tt|std::endl}} is redundant when used with {{lc|std::cout}} because any input from {{lc|std::cin}}, output to {{lc|std::cerr}}, or program termination forces a call to {{c|std::cout.flush()}}. Use of {{tt|std::endl}} in place of {{c/core|'\n'}}, encouraged by some sources, may significantly degrade output performance. |
− | In many implementations, standard output is line-buffered, and writing {{c|'\n'}} causes a flush anyway, unless {{c|std::ios::sync_with_stdio(false)}} was executed. In those situations, unnecessary {{tt|endl}} only degrades the performance of file output, not standard output. | + | In many implementations, standard output is line-buffered, and writing {{c/core|'\n'}} causes a flush anyway, unless {{c|std::ios::sync_with_stdio(false)}} was executed. In those situations, unnecessary {{tt|endl}} only degrades the performance of file output, not standard output. |
− | The code samples on this wiki [https://www.stroustrup.com/3rd_code.html follow Bjarne Stroustrup] and [https://github. | + | The code samples on this wiki [https://www.stroustrup.com/3rd_code.html follow Bjarne Stroustrup] and [https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rio-endl The C++ Core Guidelines] in flushing the standard output only where necessary. |
When an incomplete line of output needs to be flushed, the {{lc|std::flush}} manipulator may be used. | When an incomplete line of output needs to be flushed, the {{lc|std::flush}} manipulator may be used. | ||
Line 31: | Line 31: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | |With \n instead of endl, the output would be the same, but may not appear in real time. | + | |With {{c/core|'\n'}} instead of {{tt|endl}}, the output would be the same, but may not appear in real time. |
|code= | |code= | ||
#include <chrono> | #include <chrono> | ||
#include <iostream> | #include <iostream> | ||
− | + | ||
template<typename Diff> | template<typename Diff> | ||
void log_progress(Diff d) | void log_progress(Diff d) | ||
{ | { | ||
− | std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d | + | std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) |
− | << " | + | << " passed" << std::endl; |
} | } | ||
− | + | ||
int main() | int main() | ||
{ | { | ||
std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n | std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n | ||
− | volatile int sink | + | |
− | + | static volatile int sink{}; | |
− | auto t1 = std::chrono::high_resolution_clock::now(); | + | const auto t1 = std::chrono::high_resolution_clock::now(); |
− | for (int | + | for (int i = 0; i < 5; ++i) |
{ | { | ||
− | for (int | + | for (int j = 0; j < 10000; ++j) |
− | for (int | + | for (int k = 0; k < 20000; ++k) |
− | sink += | + | sink += i * j * k; // do some work |
− | + | log_progress(std::chrono::high_resolution_clock::now() - t1); | |
− | + | ||
} | } | ||
} | } | ||
|p=true | |p=true | ||
|output= | |output= | ||
− | + | 566ms passed | |
− | + | 1133ms passed | |
− | + | 1699ms passed | |
− | + | 2262ms passed | |
− | + | 2829ms passed | |
}} | }} | ||
Latest revision as of 16:43, 23 September 2023
Defined in header <ostream>
|
||
template< class CharT, class Traits > std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os ); |
||
Inserts a newline character into the output sequence os and flushes it as if by calling os.put(os.widen('\n')) followed by os.flush().
This is an output-only I/O manipulator, it may be called with an expression such as out << std::endl for any out
of type std::basic_ostream.
Contents |
[edit] Notes
This manipulator may be used to produce a line of output immediately, e.g. when displaying output from a long-running process, logging activity of multiple threads or logging activity of a program that may crash unexpectedly. An explicit flush of std::cout is also necessary before a call to std::system, if the spawned process performs any screen I/O. In most other usual interactive I/O scenarios, std::endl
is redundant when used with std::cout because any input from std::cin, output to std::cerr, or program termination forces a call to std::cout.flush(). Use of std::endl
in place of '\n', encouraged by some sources, may significantly degrade output performance.
In many implementations, standard output is line-buffered, and writing '\n' causes a flush anyway, unless std::ios::sync_with_stdio(false) was executed. In those situations, unnecessary endl
only degrades the performance of file output, not standard output.
The code samples on this wiki follow Bjarne Stroustrup and The C++ Core Guidelines in flushing the standard output only where necessary.
When an incomplete line of output needs to be flushed, the std::flush manipulator may be used.
When every character of output needs to be flushed, the std::unitbuf manipulator may be used.
[edit] Parameters
os | - | reference to output stream |
[edit] Return value
os (reference to the stream after manipulation).
[edit] Example
With '\n' instead of endl
, the output would be the same, but may 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) << " passed" << std::endl; } int main() { std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n static volatile int sink{}; const auto t1 = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 5; ++i) { for (int j = 0; j < 10000; ++j) for (int k = 0; k < 20000; ++k) sink += i * j * k; // do some work log_progress(std::chrono::high_resolution_clock::now() - t1); } }
Possible output:
566ms passed 1133ms passed 1699ms passed 2262ms passed 2829ms passed
[edit] See also
controls whether output is flushed after each operation (function) | |
flushes the output stream (function template) | |
synchronizes with the underlying storage device (public member function of std::basic_ostream<CharT,Traits> )
|