代码只能在非常奇怪的情况下工作
Code works only with very strange
我之前遇到了一个奇怪的问题。我正在研究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'
是首选方法。
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么它在不分配内存的情况下工作正常
- 此函数如何在不传递任何参数的情况下工作?
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 为什么Arduino(小端序)上的Sha1在没有转换为大端序的情况下工作?
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- OpenMP程序在没有关键部分的情况下工作
- EM_SETHANDLE,EM_GETHANDLE在没有DS_LOCALEDIT的情况下工作
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 斯芬克斯在没有数据库的情况下工作吗
- pow()函数在没有任何数学库的情况下工作
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 共享指针在未分配的情况下工作
- 为什么boost this_thread::interrupt可以在没有try-catch的情况下工作
- SDL如何在没有源文件的情况下工作
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 子进程中的Execl仅在特定情况下工作
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
- Visual c++ /MFC:让日文字符在没有UNICODE的情况下工作