我之前遇到过一个奇怪的问题。我正在插入B树,我写了一个简单的显示功能。我运行它,即使我插入了一些值,它也没有在控制台中显示任何内容。
我进入调试模式,我按照程序流程进行操作,调试器向我显示树中有值。然后我想只显示第一个节点的元素,我遇到了同样的问题:一个空的控制台。
我问我的老师会出现什么错误,他告诉我在endl
之后加cout
,就像这样:
cout << node->keys[i] << endl;
有效!
他告诉我,我可能在我的程序中使用了NULL
指针而Eclipse没有说明任何内容,但没有说明endl
如何帮助。
有人知道可能是什么问题以及endl
如何解决它?我很困惑。
我不明白缓冲区与显示功能有什么冲突。
答案 0 :(得分:1)
std::endl
刷新输出流....
cout
被缓冲,输出不会立即显示,它们将被缓冲,直到缓冲区溢出,然后将显示所有缓冲的数据。如果您想更快地显示输出,flush
它。
在输出序列os中插入一个endline字符并将其刷新 好像通过调用os.put(os.widen('\ n'))后跟os.flush()。[1]
您也可以使用std::cout.flush();
。
答案 1 :(得分:1)
我回答有点晚了,其他答案已经解释了如何冲洗,所以我想至少回答你对Johnsy答案的评论。
首先,输出被缓冲的原因是将数据写入某个输出流而不是内存中通常是一个非常慢的操作(这取决于你是想写入ssd或hdd上的文件还是仅仅是显示,但它们都比ram慢。
因此,c ++首先将其写入内部缓冲区,并且仅在缓冲区已满或刷新流时才实际写入输出。这样做是为了避免在大多数输出流上写入速度慢。
那么现在为什么你需要在显示之前刷新缓冲区... 就像已经说过的那样,实际上它只会写出来,看看缓冲区何时已满或者是否显式刷新了。现在,当程序正常结束时,所有流都会自动刷新,因此发生的事情是程序崩溃(崩溃不会刷新缓冲区),因此程序将退出而不会显示。
由于您的程序在添加endl
时会正确显示所有内容,我猜您最初会尝试输出一个nullptr
的节点,并在从main
返回之前崩溃。您可以通过在主std::cout << "end of the program" << std::endl;
之前添加return
并测试是否显示来轻松测试。
答案 2 :(得分:0)
std::endl
在输出序列(os
,在您的情况下为cout
)和flush
中插入一个结束字符,就好像通过调用os.put(os.widen('\n'))
一样os.flush()
。
std::cout
控制输出到实现定义类型的流缓冲区(从std :: streambuf派生),与标准C输出流标准输出相关联。此输出缓冲(与std::cerr
不同)
在将endl
放入源代码之前,您的缓冲区未被刷新且输出未显示在屏幕上。
答案 3 :(得分:0)
std::endl
不仅会在输出流中附加换行符,还会使其被刷新。我不太确定std::cout
上的缓冲区有多大,但是你可能没有看到任何东西,因为缓冲区未满,因此无法刷新。您可以在附加数据后尝试致电cout.flush();
(不附加std::endl
),看看是否能解决问题。
答案 4 :(得分:0)
正如 M M 在他的回答中提到的那样,std::endl
会刷新输出流。这意味着立即/实时显示或将结果/输出放到标准输出源。
使用'\n'
代替std::endl
也会产生类似的输出,但如果某些操作仍在进行中,则可能无法立即显示。
std :: endl的常见缺点被认为是性能下降,但如果将输出流式传输到显示器而不是文件,则可能没有意义 - 其中'\n'
是首选方法
希望这有帮助。