为什么从流中读取不需要刷新缓冲区

Why reading from a stream does not require a buffer flush

刚开始学习 C++ C++ Primer 5th ed.

本书第6页的第一个例子如下

#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl; 
    int v1 = 0, v2 = 0; 
    std::cin >> v1 >> v2;
    std::cout << "The sum of " << v1 << " and " << v2
        << " is " << v1 + v2 << std::endl;
    return 0;
}

操纵器endl插入换行符并刷新缓冲区。

紧接着是第7页的代码狙击,作者强调

Programmers often add print statements during debugging. Such statements should always flush the stream. Otherwise, if the program crashes, output may be left in the buffer, leading to incorrect inference about where the program crashed

从代码示例和强调的警告中,我觉得在写入 Stream 时进行刷新很重要

这里是我不明白的部分,请问如何从流中读取,例如std::cin , 那有没有必要冲水呢?

追加问题:

#include <iostream>

int main()
{
    int sum = 0, val = 1;
    while (val <= 5) {
        sum += val;
        ++val;
        std::cout << sum << std::endl; //test
    }
}

当我将标有 test 的行更改为 std::cout << sum << '\ n';,在控制台中没有视觉差异。这是为什么呢,每次循环都没有flush不是应该打印如下吗?

1
1 3
1 3 6 
1 3 6 10
1 3 6 10 15

谢谢

即使@Klitos Kyriacou 说你应该为一个新问题创建一个新的 post 是正确的,但在我看来你的两个问题都是出于同样的误解。

Programmers often add print statements during debugging. Such statements should always flush the stream. Otherwise, if the program crashes, output may be left in the buffer, leading to incorrect inference about where the program crashed

这句话并不意味着您需要刷新程序中的每个缓冲区才能在控制台上创建任何输出。 通过刷新缓冲区,您可以确保在执行下一行代码之前打印输出。 如果您不刷新缓冲区并且您的程序完成,缓冲区将被刷新。

因此,您在 std::endl\n 的控制台上看到相同输出的原因是,向控制台打印的文本完全相同。在前一种情况下,输出可能会稍微早一些,因为缓冲区会提前刷新。在后一种情况下,缓冲区稍后会被刷新,但它们会在某个时间被刷新。

这句话所说的是当你的程序没有正常退出时的情况,例如当您的程序崩溃或被 OS 中断时。在这些情况下,当您没有显式刷新缓冲区时,您的输出可能不会写入控制台。 这句话想让你知道的是:每当你想调试一个崩溃的程序时,你应该明确地刷新缓冲区以确保你的调试输出在你的程序被中断之前打印到控制台。


请注意,这可能不适用于所有实施。

来自http://en.cppreference.com/w/cpp/io/manip/endl

In many implementations, standard output is line-buffered, and writing '\n' causes a flush anyway, unless std::ios::sync_with_stdio(false) was executed.

引自同一本书第 26 页:

Buffer A region of storage used to hold data. IO facilities often store input (or out-put) in a buffer and read or write the buffer independently from actions in the program. Output buffers can be explicitly flushed to force the buffer to be written. Be default, reading cin flushes cout; cout is also flushed when the program ends normally.