FermatsTheorem Asked: 2020-02-06 02:41:21 +0800 CST 2020-02-06 02:41:21 +0800 CST 2020-02-06 02:41:21 +0800 CST 使用 std::endl 函数和回车的区别 \n 772 endl我对流处理函数有疑问。 根据我正在阅读的书(Deitel),它会刷新endl输出缓冲区。 这是什么意思?因为如果我把"\n"orstd::endl放在最后,cout我会收到相同的输出。 有没有办法可以看到差异? c++ 2 Answers Voted Best Answer userStack 2020-02-06T05:42:30+08:002020-02-06T05:42:30+08:00 endl用于生成换行符: 有什么办法可以看出区别吗?为了回答你的问题,这里有一个例子: #include <iostream> using namespace std; int main() { // your code goes here std::cout<<"hola1" << std::endl; std::cout<<"hola2" << std::endl; std::cout<<"hola3"; std::cout<<"hola4"; return 0; } 结果将是: hola1 hola2 hola3hola4 请注意,未使用for hola3yhola4endl endl与 \n 具有相同的结果,唯一的区别是它std::endl刷新输出缓冲区,而 '\n' 没有,即如果你想强制输出。用途endl 同样的例子,但有\n: #include <iostream> using namespace std; int main() { // your code goes here std::cout<<"hola1\n"; std::cout<<"hola2\n"; std::cout<<"hola3"; std::cout<<"hola4"; return 0; } OscarGarcia 2022-03-14T23:16:12+08:002022-03-14T23:16:12+08:00 他们在您阅读的文本中所说的内容是正确的,您也可以在以下任何文档中阅读std::endl: 插入换行符并刷新 插入换行符并刷新流。 它的行为等价于调用os.put('\n')(或os.put(os.widen('\n'))用于除 之外的字符类型char),然后调用os.flush(). 在西班牙语中: 插入新行并刷新临时内存 插入换行符并刷新数据流缓冲区。 它的行为等价于调用os.put('\n')(或os.put(os.widen('\n'))用于除 之外的字符类型char),然后调用os.flush(). 请记住,操作系统实现输出到用户终端的数据流的方式与输出到文件的数据流、到另一个应用程序的管道等不同。 因此,在直接输出到终端的普通应用程序中,您将无法区分刷新数据流缓冲区和不刷新它之间的区别。 为了向您展示差异,我将使用以下代码: #include <iostream> #ifdef _WIN32 #include <windows.h> #else #include <unistd.h> #define Sleep(t) usleep(t * 1000000) #endif // _WIN32 int main() { std::cout << "Comienzo" << std::endl; for (int i = 1; i <= 3; i++) { std::cout << "Iteración: " << i << "\n"; Sleep(1); } for (int i = 1; i <= 3; i++) { std::cout << "Iteración: " << i << std::endl; Sleep(1); } std::cout << "Fin" << std::endl; } 通过正常执行代码 ( ./pruebas),我们将标准输出发送到用户终端。std::endl使用或不使用没有区别,因为操作系统会在遇到回车()时自动刷新临时内存(缓冲区\n) 。 当通过将其输出发送到第二个应用./pruebas | more程序的管道来执行应用程序时(在数据流的临时存储器中,more直到第一个被执行后才会被发送以显示在用户终端上std::endl。 你可以在这里看到上面解释的效果: 它们有什么优点或"\n"用途std::endl? 使用优势"\n": 将数据写入文件、管道或 TCP 连接时,将批量写入,从而最大限度地减少完成任务所需的输入/输出操作。 使用优势std::endl: 在向用户终端发送文本时,确保用户阅读我们刚刚呈现的信息是很方便的。虽然操作系统会自动刷新缓冲区,但在使用显示增强工具(如more、less、tail -f、cat等)时,可能不会向用户显示此信息。 在通过 TCP 或 UNIX 连接进行的通信中,您要确保数据流已经发送(注意,但这并不意味着它已被另一端读取)。
endl
用于生成换行符:结果将是:
请注意,未使用for
hola3
yhola4
endl
endl
与 \n 具有相同的结果,唯一的区别是它std::endl
刷新输出缓冲区,而 '\n' 没有,即如果你想强制输出。用途endl
同样的例子,但有
\n
:他们在您阅读的文本中所说的内容是正确的,您也可以在以下任何文档中阅读
std::endl
:在西班牙语中:
请记住,操作系统实现输出到用户终端的数据流的方式与输出到文件的数据流、到另一个应用程序的管道等不同。
因此,在直接输出到终端的普通应用程序中,您将无法区分刷新数据流缓冲区和不刷新它之间的区别。
为了向您展示差异,我将使用以下代码:
通过正常执行代码 (
./pruebas
),我们将标准输出发送到用户终端。std::endl
使用或不使用没有区别,因为操作系统会在遇到回车()时自动刷新临时内存(缓冲区\n
) 。当通过将其输出发送到第二个应用
./pruebas | more
程序的管道来执行应用程序时(在数据流的临时存储器中,more
直到第一个被执行后才会被发送以显示在用户终端上std::endl
。你可以在这里看到上面解释的效果:
它们有什么优点或
"\n"
用途std::endl
?使用优势
"\n"
:使用优势
std::endl
:在向用户终端发送文本时,确保用户阅读我们刚刚呈现的信息是很方便的。虽然操作系统会自动刷新缓冲区,但在使用显示增强工具(如
more
、less
、tail -f
、cat
等)时,可能不会向用户显示此信息。在通过 TCP 或 UNIX 连接进行的通信中,您要确保数据流已经发送(注意,但这并不意味着它已被另一端读取)。