代码只能在非常奇怪的情况下工作

Code works only with very strange

本文关键字:情况下 工作 非常 代码      更新时间:2023-10-16

我之前遇到了一个奇怪的问题。我正在研究b树的插入,我写了一个简单的显示函数。我运行它,它没有在控制台中显示任何东西,即使我插入了一些值。

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

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

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

工作!然后他告诉我,可能我在我的程序中解决了一个NULL指针,Eclipse没有说任何关于这一点,但没有说endl如何帮助。

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

我回答这个问题有点晚了,其他的答案已经解释了如何冲洗,所以我想至少回答一下你对Johnsy的回答的评论。

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

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

那么现在为什么你需要在它显示之前刷新缓冲区…就像已经说过的,它实际上只是写出来,让你看看缓冲区什么时候满了,或者它被显式刷新。现在,当程序正常结束时,所有的流都会自动刷新,所以真正发生的是程序崩溃(崩溃不会刷新缓冲区),所以你的程序退出,它永远不会显示。

由于您的程序在添加endl时正确显示一切,我猜您正在尝试在最后输出具有nullptr的节点,并在从main返回之前崩溃。您可以通过在main中return之前添加std::cout << "end of the program" << std::endl;并测试它是否显示,从而轻松地进行测试。

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

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

在输出序列os中插入一个尾行字符并刷新它就好像通过调用os.put(os.拓宽('n'))之后再调用os.flush().[1]

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

std::endl在输出序列中插入一个结束字符(os,在您的示例中是cout), flush调用它,就像调用os.put(os.widen('n'))然后调用os.flush()一样。

std::cout控制输出到实现定义类型的流缓冲区(派生自std::streambuf),与标准C输出流stdout相关联。这个输出是缓冲的(不像std::cerr)

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

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

正如M M在他的回答中提到的,std::endl冲洗输出流。它的意思是立即/实时地显示或将结果/输出放到标准输出源。

使用'n'代替std::endl也会产生类似的输出,但如果某些操作仍在进行,可能不会立即显示。

std::endl的常见缺点被认为是性能下降,尽管如果输出流到显示器而不是文件中可能没有什么意义-其中'n'是首选方法。