PDA

Просмотр полной версии : проблемы с getline


cupper
20.10.2009, 23:28
В програме немогу считать гетлайном строку, просто пропускается этот оператор и все.
Я сижу уже весь дерганый %(

вот код, весь

#include <iostream>
#include <string>
#include <stdlib.h> //isdigit(int)
#include <vector>

using namespace std;

int menu_input(const string &);
int check_digit_expert(const string &);
void output_matrix(ostream &, vector<vector<bool> > &, const size_t, const int);

int main(){
int expert = menu_input("Enter quantity of experts N = ");
int dimension = menu_input("Enter quantity of dimension matrix n = ");
vector< vector<bool> > matrix(dimension, vector<bool>(dimension*dimension, 0));
string strlineMatrix;
for (int vec=0; vec<expert; vec++){
// вводим матрицу
cout<<"Please enter values "<<vec+1<<" matrix:\n";
cout<<"Begin enter\n";
int skip, count; // с какого символа и сколько копировать
int j;
for (int i=0; i<dimension; i++){
skip=0;
j=0;
/*ТУТА !!!!!!!*/ getline(cin, strlineMatrix);
cout<<strlineMatrix<<"\n\n";
for (int n=0; n<strlineMatrix.length(); n++){
while (strlineMatrix[n]==' '){++n;}
skip=n;
++n;
count=1;
while (strlineMatrix[n] !=' '){
++count;
++n;
}
cout<<string(strlineMatrix, skip, count)<<"-";
if (j>=dimension || (matrix[vec][i*dimension+j]=(bool)check_digit_expert(string(strlineMatrix, skip, count)))<0){
cout<<"TEMP 1\n";
return 1;
}
++j;
}
if (j != dimension){
cout<<"Incorrect quantity of the entered values\n"<<"To continue input ?(Y/n): ";
char key;
cin>>key;
if (key=='n') return 1;
else --i;
}

}
cout<<"End enter\n\n";

}
output_matrix(cout, matrix, dimension, 0);
//matrix.erase(matrix.begin(), matrix.end());

//----------
char a;
cin>>a;
//----------
}

int menu_input(const string &str){
/*
будет требовать ввести число экспертов до тех пока не введут корректно
возвращает введене число в int
*/
cout<<str;
string expert;
int iexpert=0;
while (1){
cin>>expert;
iexpert=check_digit_expert(expert);
if (iexpert<1){
cout<<"ERROR ENTER VALUE: you enter: \""
<<expert<<"\", needed digit >= 0\n"
<<"Please "<<str;
}
else return iexpert;
}
}
int check_digit_expert(const string &str){
/*
Если str число >=0 то возвращает int этого числа, иначе -1
*/
for (int i=0; i<str.length(); i++){
if (isdigit(str[i])==0){
return -1;
}
}
return atoi(str.c_str());
}

void output_matrix (ostream & out, vector<vector<bool> > & matrix, const size_t len, const int nummatrix){
out<<"\n---------MATRIX----------\n";
for (size_t i=0; i<len; ++i){
for (size_t j=0; j<len; ++j){
out<<matrix[nummatrix][i*len+j]<<" ";
}
out<<endl;
}
out<<"\n---------MATRIX----------\n";
}

scrat
20.10.2009, 23:50
а зачем getline? можно же fstream'омвским оператором >> пользоваться

Nikituki
21.10.2009, 00:07
cin >> strlineMatrix;

cupper
21.10.2009, 11:27
cin >> strlineMatrix;
cin>> читает до первого пробела.

---------------
вся проблема в том что getline неработает корректно если перед ним уже читалась чтрока через cin>>
Вот пример, можете проверить
#include <iostream>

using namespace std;

int main(){
string str;
cin>>str;
cout<<str<<endl;
getline(cin, str);
cout<<str<<endl;
}

Превое что приходит в голову проста заменить все cin>> на getline.

а как если без этого ?

razb
21.10.2009, 13:12
Перед вызовом getline() сделай: cin.sync()
_http://www.cplusplus.com/reference/iostream/istream/sync/

Roston
19.11.2009, 18:00
а разве не должно быть cin.getline()?
И вопше, если ты на С++ то просто делай не char а string.

~Shapaev~
19.11.2009, 21:26
cin.getline как раз таки юзают при использовании хедера string.h(Си) то бишь массив чаров , а у него тут переменная как стринг объявлена , Roston, думаю ты прав насчет того что нужно использовать эту функцию, но тогда и использовать надо char.

Roston
19.11.2009, 22:18
ТС... выдели кусок кода где именно не читается... и вопше просто попробуй читать строку в отдельной програме,а когда найдеш выход то сунь ее в свою.
Если ты например делаеш так

char text[100];
cout<<"Введите текст";
cin.getline(text,100);
cout<<text;


должно работать

Mystic.asm
20.11.2009, 00:31
Вообще-то после
cin >> str;
считывание остается на той же строке, поэтому для получения следующей строки необходимо считать из потока символ '\n' (перейти к следующей строке) оператором
getline(cin,str);
а уже потом считывать нужную строку тем же оператором

То есть просто добавь после cin >> оператор getline() или (что не рекомендую из-за более плохой читабельности кода) перед нужным getline добавь дополнительный getline(cin,str)

beerka
20.11.2009, 20:47
Считывайте всё в строку, а потом её разбирайте(можно её даже запихать в sstream). Проблем и багов будет в 100 раз меньше