bash — C ++: чтение из стандартного ввода данных при записи данных в канал

У меня есть две программы на 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~$

1

Решение

Здесь есть две проблемы.

Первый — это выходная буферизация. Вам нужно очистить выходной поток.
Вероятно, самый простой способ cout.flush(),

Во-вторых, чтение строк читает целые слова, а вы выводите только одно с паузой между ними.

Вам нужно либо перейти на ввод символов, либо поставить разделитель между словами.

Символьный ввод будет выглядеть так

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

Добавление разделителя будет выглядеть так:

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

Обратите внимание на дополнительное место.

2

Другие решения


По вопросам рекламы [email protected]