c++getline似乎无法识别通过管道传输到stdin的输入中的换行符



此代码:

$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"one_answers"there",效果很好

$垃圾你好你好那里有

到目前为止还不错。

但我有另一个程序:

$cat junk1.c

#include <stdio.h>
int
main(int argc, char **argv)
{
    int i = 4;
    while(i--)
    {
        printf("abcn");
        sleep(1);
    }
    return 0;
}

这一个输出4行"abc",并在每行之后休眠。

所以如果我这样做:

junk1|垃圾

我希望看到"abc"的每一行后面都有1秒的睡眠,但我看到的是4秒的睡眠,最后是所有4行"abc"。

显然,getline()正在缓冲来自junk1的所有输出,并且仅在junk1终止时进行处理。

这不是我需要的行为,因为我想通过管道将stdout从一个永远运行并产生大量输出的程序传输到一个像junk.cpp.这样的程序

知道这里发生了什么吗?

谢谢!

这可能是由junk1.c中的stdout被缓冲引起的:对它的所有写入(通过printf或任何其他方式)都收集在内存缓冲区中,并且只有在程序退出时才写入stdout

要强制stdout实际写入缓冲区中的内容,必须使用flush(在您的情况下,应该在每个printf之后使用它)。

最新更新