From 1496935ec242c397edb299eee8a3b2488317d4fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E4=BA=8E=E6=96=8C?= <1931127624@qq.com> Date: Tue, 24 Sep 2024 11:54:11 +0800 Subject: [PATCH] Update cpp_tricks.md --- docs/cpp_tricks.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/cpp_tricks.md b/docs/cpp_tricks.md index dd8d276..b5b5c20 100644 --- a/docs/cpp_tricks.md +++ b/docs/cpp_tricks.md @@ -978,8 +978,26 @@ cout << "Hello, World!" << '\n'; endl 是一个典型的以讹传讹错误写法,只有当你的输出是指向另一个进程的管道时,其附带的刷新功能才有作用。 -- 当输出是管道时,`cout` 需要 `endl` 才能刷新。 -- 当输出是普通控制台时,`cout` 需要 `endl` 才能刷新。 +- 当输出是管道或文件时,`cout` 需要 `endl` 才能刷新。 +- 当输出是普通控制台时,`cout` 只需 `'\n'` 就能刷新了,根本用不着 `endl`。 + +而且,管道或文件实际上也不存在频繁刷新的需求,反正 `ifstream` 析构时总是会自动刷新写入磁盘。 + +因此,`endl` 操纵符大多时候都是冗余的:控制台输出的 `cout` 只需要字符或字符串中含有 `'\n'` 就刷新了,即使是文件读写也很少会使用 `endl`。 + +如果确实需要强制刷新,也可以用 `flush` 这种更加可读的写法: + +```cpp +int num; +cout << "please input the number: " << flush; +cin >> num; + +ofstream fout("log.txt"); +fout << "immediate write 1\n" << flush; +sleep(1); +fout << "immediate write 2\n" << flush; +fout.close(); // 关闭文件时总是自动 flush,不会有残留未写入的字符 +``` ## 多线程中 cout 出现乱序?