Я пишу программу для класса структур данных 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 и направить его на клавиатуру или что-то еще? Я не уверен, что делать здесь
Как это позволит мне повторно использовать CIN для ввода с клавиатуры в программе? Проблема, с которой я сталкиваюсь, заключается в том, что любые последующие вызовы cin пропускаются, а не запрашивают пользователя для ввода. – Matt
@Matt Можете ли вы показать мне пример такого поведения 'cin' дает вам? Может быть, только один флаг состояния потока. Попробуйте выполнить 'cin.clear()' перед любыми последующими операциями ввода. – 0x499602D2
Я попробовал cin.clear(). Я действительно не могу привести пример, но он в основном пропускает мои другие звонки. Я добавлю еще несколько кодов в свой пост, чтобы дать вам представление о том, что делает программа. Я в основном заполняю двумерный массив int строковым вводом из linux-канала. – Matt