此代码:
$ cat junk.cpp
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include <string>
using namespace std;
int
main(int argc, char **argv)
{
string line;
while(getline(cin, line))
{
cout << line << endl;
}
return 0;
}
如果我运行它,工作正常,然后键入“hi”和“there
$垃圾 嗨 嗨 那里 有
到目前为止一切顺利。
但是我有另一个程序:
$ cat junk1.c
#include <stdio.h>
int
main(int argc, char **argv)
{
int i = 4;
while(i--)
{
printf("abc\n");
sleep(1);
}
return 0;
}
这一行输出4行“abc \ n”并在每行之后休眠。
所以,如果我这样做:
junk1 |垃圾
我希望看到“abc”的每一行后面都会有1秒的睡眠,但我会看到4秒的睡眠,然后是最后的4条“abc”线。
显然getline()正在缓冲junk1的所有输出,并且仅在junk1终止时进行处理。
这不是我需要的行为,因为我想将stdout从一个永远运行并产生大量输出的程序传输到像junk.cpp这样的程序。
知道这里发生了什么吗?
谢谢!
答案 0 :(得分:3)
这可能是由stdout
缓存中的junk1.c
引起的:对它的所有写入(通过printf
或任何其他方式)都收集在内存缓冲区中,并且只写入程序退出时到stdout
。
要强制stdout
实际写入缓冲区中的内容,您必须使用flush
(在您的情况下,您应该在每printf
之后使用它。)