2013-10-25 5 views
0

Я пишу программу для класса структур данных C++, которая читает в файле, отделенном пространством, и я написал небольшую функцию, чтобы я мог трубить в разных файлах и работать с ними, но я бы также нравится вводить пользовательский ввод с использованием cin, и кажется, что буфер просто зацикливается. Я как бы за пределами моей глубины, но вот моя функция ввода. Я запускаю программу по $ cat filename | ./compiledexec. Я надеялся, что кто-то может понять, почему использование cin в других местах не ждет ввода пользователя и, возможно, поможет с решением?Чтение канала stdin и пользовательского ввода

void catchPipe(int dataArray[][9]); 
    int main(){ 
     int inArray[9][9]; 
     int column; 
     catchPipe(inArray); 

     cout << "Which column would you like to check?"; 
     cin >> column; // This input is skipped totally. 
     functionChecksIfInCol(column); //Function called with garbage value 
     cout << "end program" << endl; 
     return 0; 
    } 

    void catchPipe(int dataArray[][9]){ 
     int i; 
     int n=0; 
     int pos=0; 
     string mystring; 
     while(cin){ 
      getline(cin, mystring); 
      if(n < 9){ 
       for(i = 0; i < mystring.length(); i++){ 
        if((int)mystring[i] != 32){ 
         dataArray[n][pos] = mystring[i] - '0'; 
         pos++; 
        } 
       }pos =0; 
      ++n; 
      } 
     } 
    }// end catchPipe() 
    //Sample File input:  
    0 8 0 1 7 0 0 0 3 
    0 2 0 0 0 0 0 0 9 
    0 9 0 0 3 0 5 4 8 
    0 0 4 0 9 0 0 0 0 
    0 0 0 7 0 3 0 0 0 
    0 0 0 0 1 0 4 0 0 
    6 1 9 0 8 0 0 5 0 
    7 0 0 0 0 0 0 8 0 
    2 0 0 0 6 4 0 1 0 

Спасибо!

Программа заполняет мой inArray, но она пропускает следующий вызов cin. Я предполагаю, что это потому, что stdin был перенаправлен с клавиатуры на канал из linux? Может быть, я могу объявить еще один объект istream и направить его на клавиатуру или что-то еще? Я не уверен, что делать здесь

ответ

0

Используйте вектор:

void cachePipe(std::vector<std::vector<int>> data) 
{ 
    std::string line; 
    while (std::getline(std::cin, line)) 
    { 
     std::istringstream iss(line); 
     std::vector<int> fill((std::istream_iterator<int>(line)), 
          std::istream_iterator<int>()); 
     data.push_back(fill); 
    } 
} 
+0

Как это позволит мне повторно использовать CIN для ввода с клавиатуры в программе? Проблема, с которой я сталкиваюсь, заключается в том, что любые последующие вызовы cin пропускаются, а не запрашивают пользователя для ввода. – Matt

+0

@Matt Можете ли вы показать мне пример такого поведения 'cin' дает вам? Может быть, только один флаг состояния потока. Попробуйте выполнить 'cin.clear()' перед любыми последующими операциями ввода. – 0x499602D2

+0

Я попробовал cin.clear(). Я действительно не могу привести пример, но он в основном пропускает мои другие звонки. Я добавлю еще несколько кодов в свой пост, чтобы дать вам представление о том, что делает программа. Я в основном заполняю двумерный массив int строковым вводом из linux-канала. – Matt

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