C ++:从stdin读取数据写入管道

时间:2015-04-17 01:36:23

标签: c++ bash piping

我有两个C ++程序:一个用于向stdout输出消息,另一个用于监听stdin并打印流中的所有内容。它们分别命名为outin

out.cpp:

#include <iostream>

using namespace std;

int main() {
        cout<<"HELLO";
        usleep(1000000);
        cout<<"HELLO";
}

in.cpp:

#include <iostream>

using namespace std;

int main() {
        string input;
        while(cin>>input) {
                cout<<input;
        }
}

目前的情况是,将数据从out传输到in等待两秒钟,然后打印HELLOHELLO

~$ ./out | ./in

#...two seconds later:
~$ ./out | ./in
HELLOHELLO~$

我确定这是一个简单的问题,但是in是否可以打印每个HELLO,因为out会打印它?我读过piped commands run concurrently,但我必须对这种特殊情况误解这个概念。期望的表现是:

~$ ./out | ./in

#...one second later:
~$ ./out | ./in
HELLO

#...one second after that:
~$ ./out | ./in
HELLOHELLO~$

1 个答案:

答案 0 :(得分:2)

这里有两个问题。

第一个是输出缓冲。你需要flush the output stream。 可能最简单的方法是cout.flush()

第二个是字符串阅读读取整个单词,而你只输出一个,暂停之间。

您需要切换到基于字符的输入,或在单词之间放置分隔符。

基于字符的输入看起来像这样

int main() {
        char input;
        while(cin>>input) {
                cout<<input;
        }
}

添加分隔符如下所示:

int main() {
        cout<<"HELLO";
        cout<<" ";
        usleep(1000000);
        cout<<"HELLO";
}

请注意额外的空间。