0

我之前遇到了一个奇怪的问题。我在 B-trees 中进行插入工作,并编写了一个简单的显示函数。我运行它,即使我插入了一些值,它也没有在控制台中显示任何内容。

我进入了调试模式,我跟随程序的流程,调试器向我显示树中有值。然后我只想显示第一个节点的元素,我遇到了同样的问题:一个空的控制台。

我问我的老师会是什么错误,他告诉我放一个endlafter cout,像这样:

cout << node->keys[i] << endl;

有效!然后他告诉我,可能我NULL在我的程序中处理了一个指针,而 Eclipse 没有说任何关于它的内容,但没有说明如何endl提供帮助。

有谁知道可能是什么问题以及如何endl解决它?我非常非常困惑。我不明白刷新缓冲区与我的显示功能有什么关系。

4

5 回答 5

1

我回答有点晚了,其他答案已经解释了如何冲洗,所以我想至少回答你对约翰西答案的评论。

首先,输出被缓冲的原因是,将数据写入某个输出流而不是内存通常是一个非常慢的操作(这个 ofc 取决于您是想写入 ssd 或 hdd 上的文件还是仅写入显示器,但它们都比内存慢)。

因此,c++ 首先将其写入内部缓冲区,并且仅在缓冲区已满或刷新流时才实际写入输出。这样做是为了避免在大多数输出​​流上写入操作缓慢。

那么现在为什么你需要在缓冲区显示之前刷新它......就像已经说过的那样,它实际上只是将它写出来让你查看缓冲区何时已满或它被显式刷新。现在,当程序正常结束时,所有流都会自动刷新,所以发生的事情是程序崩溃(崩溃不会刷新缓冲区),因此您的程序退出而不会显示。

由于您的程序在添加时正确显示所有内容,endl我猜您正试图在nullptr最后输出一个带有 a 的节点,并在从main. 您可以通过在in mainstd::cout << "end of the program" << std::endl;之前添加并测试它是否显示来轻松测试它。return

于 2013-03-12T14:40:57.547 回答
1

std::endl刷新输出流....

cout被缓冲,输出不会立即显示,它们将被缓冲,直到缓冲区溢出,然后将显示所有缓冲的数据。如果你想更快地显示输出,flush它。

在输出序列 os 中插入一个结束符并刷新它,就像调用 os.put(os.widen('\n')) 后跟 os.flush() 一样。[1]

你也可以用std::cout.flush();

于 2013-03-12T11:40:27.423 回答
0

As M M has mentioned in his answer as have others above, the std::endl flushes output stream. What it means is to display or put the results/output to the standard output source immediately/real time.

Using '\n' instead of std::endl will also result in similar output but may not be displayed immediately if some operation is still going on.

The common down side of std::endl is considered to be degradation of performance, though it may not be of significance if the output is streamed to a display instead of a file - where the '\n' is the preferred method.

Hope this helps.

于 2013-03-12T13:43:21.567 回答
0

std::endl在输出序列中插入一个结束字符(os在您的情况下为cout),并flushes 它就像通过调用os.put(os.widen('\n'))后跟os.flush().

std::cout控制输出到与标准 C 输出流 stdout 相关联的实现定义类型的流缓冲区(从 std::streambuf 派生)。此输出被缓冲(与 不同std::cerr

在您endl输入源代码之前,您的缓冲区没有被刷新,输出也没有出现在您的屏幕上。

于 2013-03-12T11:40:35.097 回答
0

std::endl不仅将换行符附加到输出流,而且还导致它被刷新。我不太确定缓冲区有多大std::cout,但您可能看不到任何东西,因为缓冲区未满,因此不会被刷新。cout.flush();您可以在附加数据(不附加)后尝试调用std::endl,看看是否能解决问题。

于 2013-03-12T11:41:07.420 回答