У меня есть две программы на C ++: одна печатает сообщение в stdout, а другая слушает stdin и печатает весь контент из потока. Они названы out
а также in
соответственно.
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
печатает это? Я прочитал это конвейерные команды выполняются одновременно, но я, должно быть, неправильно понимаю эту концепцию для данной конкретной ситуации. Желаемая производительность:
~$ ./out | ./in
#...one second later:
~$ ./out | ./in
HELLO
#...one second after that:
~$ ./out | ./in
HELLOHELLO~$
Здесь есть две проблемы.
Первый — это выходная буферизация. Вам нужно очистить выходной поток.
Вероятно, самый простой способ cout.flush()
,
Во-вторых, чтение строк читает целые слова, а вы выводите только одно с паузой между ними.
Вам нужно либо перейти на ввод символов, либо поставить разделитель между словами.
Символьный ввод будет выглядеть так
int main() {
char input;
while(cin>>input) {
cout<<input;
}
}
Добавление разделителя будет выглядеть так:
int main() {
cout<<"HELLO";
cout<<" ";
usleep(1000000);
cout<<"HELLO";
}
Обратите внимание на дополнительное место.