проблемы с getline

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cupper, 20 Oct 2009.

  1. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    В програме немогу считать гетлайном строку, просто пропускается этот оператор и все.
    Я сижу уже весь дерганый %(

    вот код, весь
    Code:
    #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";
    }
     
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    а зачем getline? можно же fstream'омвским оператором >> пользоваться
     
  3. Nikituki

    Nikituki New Member

    Joined:
    14 Mar 2009
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    Code:
    cin >> strlineMatrix;
     
  4. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    cin>> читает до первого пробела.

    ---------------
    вся проблема в том что getline неработает корректно если перед ним уже читалась чтрока через cin>>
    Вот пример, можете проверить
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main(){
            string str;
            cin>>str;
            cout<<str<<endl;
            getline(cin, str);
            cout<<str<<endl;
    }
    Превое что приходит в голову проста заменить все cin>> на getline.

    а как если без этого ?
     
    #4 cupper, 21 Oct 2009
    Last edited: 21 Oct 2009
  5. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Перед вызовом
    Code:
    getline()
    сделай:
    Code:
    [b]cin.sync()[/b]
    _http://www.cplusplus.com/reference/iostream/istream/sync/
     
    #5 razb, 21 Oct 2009
    Last edited: 21 Oct 2009
    1 person likes this.
  6. Roston

    Roston Elder - Старейшина

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    а разве не должно быть cin.getline()?
    И вопше, если ты на С++ то просто делай не char а string.
     
    #6 Roston, 19 Nov 2009
    Last edited: 19 Nov 2009
  7. ~Shapaev~

    ~Shapaev~ Member

    Joined:
    24 Oct 2009
    Messages:
    29
    Likes Received:
    7
    Reputations:
    0
    cin.getline как раз таки юзают при использовании хедера string.h(Си) то бишь массив чаров , а у него тут переменная как стринг объявлена , Roston, думаю ты прав насчет того что нужно использовать эту функцию, но тогда и использовать надо char.
     
  8. Roston

    Roston Elder - Старейшина

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    ТС... выдели кусок кода где именно не читается... и вопше просто попробуй читать строку в отдельной програме,а когда найдеш выход то сунь ее в свою.
    Если ты например делаеш так
    Code:
    char text[100];
    cout<<"Введите текст";
    cin.getline(text,100);
    cout<<text;
    
    должно работать
     
  9. Mystic.asm

    Mystic.asm New Member

    Joined:
    20 Aug 2008
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Вообще-то после
    cin >> str;
    считывание остается на той же строке, поэтому для получения следующей строки необходимо считать из потока символ '\n' (перейти к следующей строке) оператором
    getline(cin,str);
    а уже потом считывать нужную строку тем же оператором

    То есть просто добавь после cin >> оператор getline() или (что не рекомендую из-за более плохой читабельности кода) перед нужным getline добавь дополнительный getline(cin,str)
     
    #9 Mystic.asm, 19 Nov 2009
    Last edited: 19 Nov 2009
  10. beerka

    beerka New Member

    Joined:
    13 Jan 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Считывайте всё в строку, а потом её разбирайте(можно её даже запихать в sstream). Проблем и багов будет в 100 раз меньше