相关疑难解决方法(0)

"\n"或"\n"或std :: endl到std :: cout?

自从我std::endl在写作时停止使用结束行std::cout并开始使用以来已经很多年了"\n".

但现在我开始看到更多的代码片段'\n',我开始想知道什么是最好的.

除了显而易见的是一个字符串,另一个字符,使用它有任何好处:

std::cout << variable << '\n';
Run Code Online (Sandbox Code Playgroud)

在此:

std::cout << variable << "\n";
Run Code Online (Sandbox Code Playgroud)

迟到:

当我问这个问题时,我似乎认为换行'\n'刷新了缓冲区.现在我知道这取决于.

默认情况下std::cin,绑定到旧的C stdin FILE*流,并std::cout绑定到stdout.新线上的冲洗来自这种搭售.默认情况下stdout,如果连接到终端,则进行行缓冲.这意味着新行将刷新其缓冲区.因此,当使用打印换行符std::cout时,将导致stdout刷新.

如果stdout未连接到的终端(例如,输出已经被重定向或用管道输送),或者如果之间的联系std::coutstdout被打破,则换行符将不刷新任何东西.

c++ string character

90
推荐指数
3
解决办法
6万
查看次数

新行字符是否也刷新缓冲区?

我明白,问题,如,差异endl\n已经多次回答SO.但是他们只提到endl能够将缓冲区冲到上面stdout,而\n不是.

因此,我通过刷新缓冲区理解的是,给定的输入存储在一个缓冲区中,并且stdout仅在它遇到endl时或者一些明确的flush函数传递给它.如果是这样,我预计以下代码:

#include <iostream>
#include <unistd.h>

int main(void)
{
    std::cout << "Hello\nworld";
    sleep(2);
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显示:

2秒后

Hello
World
Run Code Online (Sandbox Code Playgroud)

但实际产量是:

Hello
Run Code Online (Sandbox Code Playgroud)

2秒后

World
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

也不\n应该存储在缓冲区中,只有在endl遇到缓冲区时才会被刷新/显示在上面stdout,但是从我观察到的\n是同样的行为endl.

c++ flush endl

7
推荐指数
2
解决办法
2190
查看次数

标签 统计

c++ ×2

character ×1

endl ×1

flush ×1

string ×1