2015-04-17 3 views
1

У меня есть две программы на C++: одна, которая выводит сообщение на stdout, а другая, которая прослушивает stdin и печатает весь контент из потока. Они называются out и in соответственно.C++: Чтение из stdin, поскольку данные записываются в трубу

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~$ 

ответ

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"; 
} 

Примечание дополнительное пространство.

 Смежные вопросы

  • Нет связанных вопросов^_^