我明白,问题,如,差异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.
我想要一个带有前缀的ostream,在cout上重定向的每一行的开头; 我试试这个:
#include <iostream>
#include <thread>
class parallel_cout : public std::ostream
{
public:
parallel_cout(std::ostream& o):out(o){}
template <typename T>
std::ostream& operator<< (const T& val)
{
out << "prefix " << val;
return *this;
}
std::ostream& out;
};
int main()
{
parallel_cout pc(std::cout);
pc<<"a\nb"<<"c\n";
}
Run Code Online (Sandbox Code Playgroud)
但我有输出
prefix a
b
Run Code Online (Sandbox Code Playgroud)
没有c.为什么这个?