这段代码:
$ 猫垃圾.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”
$垃圾 你好 你好 那里 那里
到目前为止一切顺利。
但是我有另一个程序:
$猫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"并在每行之后休眠。
如果我这样做:
垃圾1 |垃圾
我希望看到每行“abc”后跟一个 1 秒的 sleep ,但我看到的是 4 秒的 sleep ,最后是所有 4 个“abc”行。
显然 getline() 正在缓冲来自 junk1 的所有输出,并且仅在 junk1 终止时才继续。
这不是我需要的行为,因为我想将 stdout 从一个永远运行并产生大量输出的程序通过管道传输到像 junk.cpp 这样的程序。
知道这里发生了什么吗?
谢谢!
最佳答案
这可能是由于 junk1.c
中的 stdout
被缓冲造成的:所有写入它(通过 printf
或任何其他方式)都是收集在内存缓冲区中,仅在程序退出时写入 stdout
。
要强制 stdout
实际写入缓冲区中的内容,您必须使用 flush
(在您的情况下,您应该在每个 printf 之后使用它
)。
关于c++ getline 似乎无法识别通过管道传输到标准输入的输入中的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922740/