Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   проблемы с getline (https://forum.antichat.xyz/showthread.php?t=149886)

cupper 20.10.2009 23:28

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

вот код, весь
Код:

#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

Цитата:

Сообщение от Nikituki
Код:

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 раз меньше


Время: 08:27