Difference between revisions of "cpp/io/manip/endl"
m (r2.7.3) (Robot: Adding de, es, fr, it, ja, pt, ru, zh) |
m (Fix C++ Core Guidelines link) |
||
(13 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|endl}} | {{cpp/title|endl}} | ||
{{cpp/io/manip/navbar}} | {{cpp/io/manip/navbar}} | ||
− | {{ddcl | header=ostream | | + | {{ddcl|header=ostream| |
template< class CharT, class Traits > | template< class CharT, class Traits > | ||
− | std::basic_ostream< | + | std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os ); |
}} | }} | ||
− | Inserts a | + | Inserts a newline character into the output sequence {{c|os}} and flushes it as if by calling {{c|os.put(os.widen('\n'))}} followed by {{c|os.flush()}}. |
− | This is an output-only I/O manipulator, it may be called with an expression such as {{c|out << std::endl}} for any {{tt|out}} of type {{ | + | This is an output-only I/O manipulator, it may be called with an expression such as {{c|out << std::endl}} for any {{tt|out}} of type {{lc|std::basic_ostream}}. |
===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 {{ | + | 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:: | + | 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 [ | + | 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 {{ | + | When an incomplete line of output needs to be flushed, the {{lc|std::flush}} manipulator may be used. |
− | When every character of output needs to be flushed, the {{ | + | When every character of output needs to be flushed, the {{lc|std::unitbuf}} manipulator may be used. |
===Parameters=== | ===Parameters=== | ||
− | {{ | + | {{par begin}} |
− | {{ | + | {{par|os|reference to output stream}} |
− | {{ | + | {{par end}} |
===Return value=== | ===Return value=== | ||
− | + | {{c|os}} (reference to the stream after manipulation). | |
− | {{ | + | |
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |With {{c/core|'\n'}} instead of {{tt|endl}}, the output would be the same, but may not appear in real time. | |
− | + | |code= | |
+ | #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 | |
− | + | |output= | |
− | + | 566ms passed | |
− | + | 1133ms passed | |
− | + | 1699ms passed | |
− | + | 2262ms passed | |
+ | 2829ms passed | ||
}} | }} | ||
===See also=== | ===See also=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc inc|cpp/io/manip/dsc unitbuf}} |
− | {{ | + | {{dsc inc|cpp/io/manip/dsc flush}} |
− | {{ | + | {{dsc inc|cpp/io/basic_ostream/dsc flush}} |
− | {{ | + | {{dsc end}} |
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
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> )
|