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

c++ getline does not seem to recognize newlines in input piped to stdin

此代码:

$猫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" 和“那里

$ 垃圾 你好 你好 那里 那里

到目前为止一切顺利。

但我还有另一个程序:

$猫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 秒的睡眠,但我看到的是 4 秒的睡眠,最后是所有 4 "abc" 行。

显然 getline() 正在缓冲来自 junk1 的所有输出,并且仅在 junk1 终止时才继续。

这不是我需要的行为,因为我想将标准输出从一个 运行 永远存在并产生大量输出的程序传输到 junk.cpp.[=12= 这样的程序]

知道这里发生了什么吗?

谢谢!

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

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