说明:
在cout
中,我希望插入运算符<<
传递的所有值都显示在屏幕上。
通常人们会认为以下代码无故障运行:
int n = 0;
cout << n;
确实如此,是的,始终使用endl
是一种好习惯。但我遇到的问题非常奇怪(至少对我来说)。
问题: 我有以下代码:
cout << " value at array point 0: " << (list)[length -1] << endl;
cout << " Retry: " << (list)[length - 1];
list
是一个指向整数数组的0索引内存位置的指针。 length
是数组长度。你会想象这段代码没有错误,对吗?错误。由于某种原因,第二行不会显示 - 我没有丝毫的线索为什么。然后,出于好奇,我将endl
添加到" Retry: "
的末尾,并且它有效。我不知道为什么,这真的很困扰我。
提前感谢所有帮助!
代码的基本概述
// Prototype
void listAdd( int* list, int& length );
int main()
{
/* this program was created for practice with dynamic memmory with arrays.
It should be able to extend the list, destroy it, and pop from it.
*/
int length = 0;
int *list = NULL;
for( int i = 0; i < 5; i ++)
{
listAdd( list, length );
//listDisplay( list, length);
}
cout << " if this has been displayed the program ended correctly." << endl;
return 0;
}
void listAdd(int *list, int &length) {
int* tempList = new int[ length + 1 ];
for( int i = 0; i < length; i ++ )
{
(tempList)[i] = (list)[ i ];
}
cout << " Enter a number: ";
int stored = 0;
cin >> stored;
cout << endl;
if ( list != NULL )
delete[] list;
cout << " Previous adress: " << hex << list << endl;
list = tempList;
cout << " New address: " << hex << list << endl << dec;
length ++;
cout << " Length: " << length << endl;
(list)[length -1] = stored;
cout << " value at array point 0: " << (list)[length -1] << endl;
cout << " Retry: " << (list)[length - 1];
}
答案 0 :(得分:5)
您需要手动刷新流。您应该在发布的代码后使用“cout.flush()”。
“std :: cout&lt;&lt; std :: endl”的作用是 - 它打印'\ n'符号,然后刷新流(与std::cout.flush()
相同。
P.S。使用“endl”总是一个好习惯是不正确的。您通常应使用'\ n'来打印新的线符号。并且只在这类情况下使用std::endl
。
答案 1 :(得分:5)
流式输出被写入缓冲区,并且在刷新流之前可能无法写入最终目标。 std::endl
将插入行尾,然后刷新。您可以插入std::flush
或调用flush()
成员函数,在不插入行尾的情况下进行刷新,如果这是您想要的。
总是使用“endl”
是一种好习惯
不是真的。经常刷新,特别是在写入文件时,会降低性能。
答案 2 :(得分:3)
endl
刷新stdout流。您的输出可能只是在等待打印到屏幕的缓冲区中。这种行为没有任何问题(除了你确实期待别的东西)。
尝试使用手册flush
代替endl。这应该导致相同的行为。
答案 3 :(得分:3)
引用cppreference:
将一个endline字符插入到输出序列os中并将其刷新,就像调用os.put(os.widen('\ n'))后跟os.flush()一样。
所以输出就在缓冲区中。输出更多东西 - 或明确刷新 - 将导致它被显示。
我同意其他答案,说明不必要地添加std::endl
或更多通常比你需要更频繁地冲洗不是一个好习惯。
答案 4 :(得分:2)
如果您在第二个输出的末尾添加了std::endl
并且它有效,那是因为endl
刷新了流缓冲区。否则,您正在等待下一个缓冲区写入屏幕(如果您的程序在此之前退出,您可能在关闭窗口之前没有看到它 - 它会将其写出来并几乎立即关闭程序)。 / p>
答案 5 :(得分:1)
如果您没有自动执行此操作,则需要刷新流。
发送换行符(endl)将导致流刷新。
如果您确实要刷新并将光标保持在同一行,请添加cout.flush()
以显式刷新缓冲的流数据。
e.g:
cout << " value at array point 0: " << (list)[length -1] << endl;
cout << " Retry: " << (list)[length - 1];
cout.flush();