@@ -421,7 +421,7 @@ <h2 id="index-_1">前言</h2>
421
421
<blockquote>
422
422
<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
423
423
</blockquote>
424
- <p>更新时间:2024年09月22日 21:08:12 (UTC+08:00)</p>
424
+ <p>更新时间:2024年09月24日 11:54:32 (UTC+08:00)</p>
425
425
<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
426
426
<h2 id="index-_2">格式约定</h2>
427
427
<blockquote>
@@ -1841,9 +1841,22 @@ <h2 id="cpp_tricks-cout-endl">cout 不需要 endl</h2>
1841
1841
</code></pre>
1842
1842
<p>endl 是一个典型的以讹传讹错误写法,只有当你的输出是指向另一个进程的管道时,其附带的刷新功能才有作用。</p>
1843
1843
<ul>
1844
- <li>当输出是管道时,<code>cout</code> 需要 <code>endl</code> 才能刷新。</li>
1845
- <li>当输出是普通控制台时,<code>cout</code> 需要 <code>endl</code> 才能刷新。</li>
1846
- </ul>
1844
+ <li>当输出是管道或文件时,<code>cout</code> 需要 <code>endl</code> 才能刷新。</li>
1845
+ <li>当输出是普通控制台时,<code>cout</code> 只需 <code>'\n'</code> 就能刷新了,根本用不着 <code>endl</code>。</li>
1846
+ </ul>
1847
+ <p>而且,管道或文件实际上也不存在频繁刷新的需求,反正 <code>ifstream</code> 析构时总是会自动刷新写入磁盘。</p>
1848
+ <p>因此,<code>endl</code> 操纵符大多时候都是冗余的:控制台输出的 <code>cout</code> 只需要字符或字符串中含有 <code>'\n'</code> 就刷新了,即使是文件读写也很少会使用 <code>endl</code>。</p>
1849
+ <p>如果确实需要强制刷新,也可以用 <code>flush</code> 这种更加可读的写法:</p>
1850
+ <pre><code class="language-cpp">int num;
1851
+ cout << "please input the number: " << flush;
1852
+ cin >> num;
1853
+
1854
+ ofstream fout("log.txt");
1855
+ fout << "immediate write 1\n" << flush;
1856
+ sleep(1);
1857
+ fout << "immediate write 2\n" << flush;
1858
+ fout.close(); // 关闭文件时总是自动 flush,不会有残留未写入的字符
1859
+ </code></pre>
1847
1860
<h2 id="cpp_tricks-cout">多线程中 cout 出现乱序?</h2>
1848
1861
<p>同学:小彭老师,我在多线程环境中使用:</p>
1849
1862
<pre><code class="language-cpp">cout << "the answer is " << 42 << '\n';
0 commit comments