Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2010, 13:02   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию проблемы с командой printf "abcd abcd\nabcd" | ./a.out

ОС Linux, компилятор g++
Простенький пример

Код:
#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
//сначало считывается текст( до нажатия ctrl+d) и записывается в вектор
     string line, word;
     vector<string> v;
     while( getline(cin, line))
            v.push_back(line);

//затем нужно напрасить слово, которое в дальнейшем будет найдено в тексте
// отсюда начинается проблема 
     cin >> word;

     cout << word << endl;    
     
     return 0;
}
в общем после ввода текста программа срубается и не дает ввести слово
пробовал очищать входной поток методом cin.clear() не выходит
причем если запускать без printf , т.е
./a.out
всё работает как надо

в чем может быть проблема и как вообще работает такая связка
printf "text" | ./a.out

Этой командой препод проверяет работу программы, так что вопросы зачем так запускать пожалуйста не задавать=)

Последний раз редактировалось NiCola999; 17.02.2010 в 20:12.
NiCola999 вне форума Ответить с цитированием
Старый 17.02.2010, 18:10   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

никто не знает?
NiCola999 вне форума Ответить с цитированием
Старый 17.02.2010, 18:15   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

cin.clear() не очищает входной поток, а сбрасывает флаги.
http://cplusplus.com/reference/iostream/istream/ignore/
http://cplusplus.com/reference/iostream/istream/sync/
netrino вне форума Ответить с цитированием
Старый 17.02.2010, 20:10   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а почему программа срубается ?

printf "abcd" | ./a.out это конвейерная обработка команд в Linux

строка abcd пропускается по каналу через исполняемый файл(a.out). Это примерно тоже самое что запустить a.out и ввести строку abcd
А вот дальше непонятно. Почему cin не работает

Последний раз редактировалось MaTBeu; 17.02.2010 в 21:59.
NiCola999 вне форума Ответить с цитированием
Старый 17.02.2010, 23:11   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Простой пример на Си
Код:
#include <stdio.h>

int main(void)
{    
     char a[50], b[60];
     scanf("%s", &a);
     printf("A: %s\n", a);	 
     scanf("%s", &b);
     printf("B: %s\n", b);
     
     return 0;
}
запуск на Windows XP через ком. строку
gcc test.c -o test
echo hello | test.exe

таже проблема что и в с++, кто может обьяснить в чем дело и как сделать чтобы работало?
вывод такой:
A: hello
B: █☺С|<*"

причем b не просит ввести

Последний раз редактировалось NiCola999; 17.02.2010 в 23:15.
NiCola999 вне форума Ответить с цитированием
Старый 17.02.2010, 23:19   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

чтоб работало:
Код:
#include <stdio.h>

int main(void)
{    
     char a[50], b[60];
     scanf("%s", a);
     printf("A: %s\n", a);	 
     scanf("%s", b);
     printf("B: %s\n", b);
     
     return 0;
}
Carbon вне форума Ответить с цитированием
Старый 17.02.2010, 23:30   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ниче не изменилось, тоже самое выдает:
A: hello
B: █☺С|<*"

b не запрашивает
NiCola999 вне форума Ответить с цитированием
Старый 18.02.2010, 00:00   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А почему она должна что-то спрашивать? Она получила строку, поток закончился, считала мусор и всё.
Carbon вне форума Ответить с цитированием
Старый 18.02.2010, 00:36   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

хорошо, обьясните тогда как исправить эту программу чтобы она работала как надо при таком запуске
Linux:
$printf "word" | ./a.out

Windows:
echo word | a.exe
Код:
#include <iostream>
#include <vector>
using namespace std;

void vOut(vector<string>);

int main(void)
{
  string line,word,tmp;
  vector<string> v;
  while(getline(cin,line))
     v.push_back(line);

  cout << "Enter word:" << endl;
  cin >> word;
  vOut(v);
  cout << "Word: " << word << endl;
  return 0;
}

void vOut(vector<string> v)
{
      for(int i=0; i<(int)v.size(); i++) cout << v[i];
	  cout << endl;
}
"как надо" всмысле считывала строку из команды printf или echo
затем запрашивала еще одно слово и выводила на экран всё это

в данном случае всё работает кроме ввода слова после считывания строки=)

Последний раз редактировалось NiCola999; 18.02.2010 в 00:51.
NiCola999 вне форума Ответить с цитированием
Старый 18.02.2010, 14:52   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

что никто не знает?
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите настроить вывод "printf" sp_Иришка Общие вопросы C/C++ 8 10.10.2009 21:56
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Удалить из строки все группы букв вида abcd Григорийpnz Паскаль, Turbo Pascal, PascalABC.NET 5 27.11.2008 12:48
Удалить из строки все группы вида abcd Григорийpnz Паскаль, Turbo Pascal, PascalABC.NET 8 18.11.2008 19:40