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

标签 c++ getline

这段代码:

$ 猫垃圾.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/

相关文章:

c++ - 将 1 个 cpu 核心分配给 1 个线程 c++

c++ - 链接 .lib 文件 : fatal error LNK1107

c++ 如何在不进行深度复制的情况下展平 xtensor 的 View ?

c++ - 如何从 openCV 中使用 triangulatePoints() 获得良好的坐标

c++ - 使用多个分隔符 C++ 读取格式化数据

c++ - 如何使用 getline 和 stringstream 来解析格式化的日期和时间输入?

c++ - 从 'int' 到 'char *' 的无效转换

c++ - 使所有继承虚拟化有缺点吗?

c++ - 如何使用 cin.getline 修复 "No instance of overloaded function"错误?

c++ - 在C++中获取行函数无法正常工作