ошибка сегментации: ядро ​​сбрасывается при доступе к CSV-записям из файла - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над проектом колледжа c ++ и создаю функцию, которая анализирует CSV-файл и читает записи, хранящиеся в нем. Но он выдает ошибку каждый раз, когда я использую эту функцию

Пример файла CSV:

9138119,913811921297,Shivam,J,Jha,3811921297,sj@g.c,DEL,sji2ns,100,sj@bank

Я пытался использовать функцию reserve () вектора

void person::login(){
   bool found = false;

   fstream fin;
   fin.open("acc_info.csv", ios:: in);

   string CRN, Password;
   cout << "\nEnter CRN: ";
   getline(cin, CRN);

   cout << "\nEnter password :";
   getline(cin, Password);

   vector<string> record;
   string line, word, temp;

   if(fin){
      while(fin >> temp){
         record.clear();
         getline(fin, line);
         stringstream s(line);

         while(getline(s, word, ',')){
            record.push_back(word);
         }

         if(CRN == record[0] && Password == record[10]){
            found = true;
            cout << "\nLogin successfull!\n\n";
            break;
         }
      }
      if(!found){
         cout << "\nWrong CRN and password entered\n\n";
      }
   }
   else{
      cout << "\nTechnical fault occured.. try again after some time!!\n\n";
   }
}

сопоставьте CRN и пароль, введенные пользователем, и укажите, будет ли успешный вход в систему или нет

Вот класс персоны:

class person {

    public:
        void welcome();
        void show_account();
        void after_user_choice(int);
        void create_acc();
        void login();
        void accounts();
        void deposit();
        void cards();
        void loans();
        void insurance();
        void investments();
        int check(int, int, int);
        bool d;
        string retacno() const{
            return acc_no;
        }

        ~person();


        int x=5;

    protected:
        void show_acc_info(const unsigned long int);


        string firstname , middlename , lastname , address  , pan_no , fname ;
        string password, mobile_no ;
        string acc_no, crn, balance= "100";
        string email_id;
        string line, word, temp;

    private:
        string usr ; 
        string pswd;


};

Вот как я это сделалввод от пользователя для записи в файл CSV:

void person::create_acc(){

     ofstream xl("acc_info.csv" , ios::app );
         cout<<"ENTER FIRST NAME\n";
     getline(cin,firstname);

     cout<<"ENTER MIDDLE NAME \n";
     getline(cin,middlename);

     cout<<"ENTER LAST NAME: "<<endl;
     getline(cin,lastname);  

     cout<<"ENTER FATHER'S NAME: "<<endl;
     getline(cin,fname);  

     cout<<"ENTER YOUR EMAIL_ID: ";
     getline(cin,email_id);

     cout<<"ENTER PAN CARD NUMBER: "<<endl;
     getline(cin,pan_no);

     cout<<"ENTER YOUR RESIDENTIAL ADDRESS: "<<endl;
     getline(cin,address);  

     cout<<"ENTER YOUR MOBILE NUMBER: "<<endl;
     getline(cin, mobile_no);

    acc_no = to_string(910000000000 + stol(mobile_no, nullptr, 10)); //generating acc no;

    crn = to_string(int(stol(acc_no)/100000)); //generating crn;
     string repswrd;
     bool z;

    do{

     cout<<"ENTER PASSWORD FOR YOUR CRN(USER_ACC): ";
     getline(cin,password);    

     cout<<"RE-ENTER YOUR PASSWORD: ";
     getline(cin,repswrd);

     if(!(password.compare(repswrd))){

           cout<<"Passwords matched succesfully!"<<endl<<endl;
           z = true;
           }
     else{

          cout<<"Passwords didn't match!!! Try again\n"<<endl;
          z = false;
               }

         }while(!z);

      cout<<"\n\nAccount created successfully\n\n";

      cout << "Customer Satisfaction is our main"
           << "priority, so we have deposited a "
           << "sum of Rs. 100 into your bank a/c"
           << endl << endl;

     xl<<crn<<","
      << acc_no<< ","
     << firstname << "," 
     << middlename << "," 
     << lastname<< ","
     << mobile_no<< ","
     <<email_id<<","
     << address<< ","
     <<pan_no<<","
     <<balance << ","
     << password<< "\n";

     xl.close();

     cout<<endl;  

     }

1 Ответ

1 голос
/ 07 ноября 2019

Ваш while(fin >> temp) читает строку и помещает ее в temp, но вы ее не используете, поэтому line будет пустым, даже если за ним будет следовать другая допустимая строка в файле. >> оставляет символ новой строки в потоке, и это единственное, что прочитает следующее std::getline. Он всегда будет читать пустые строки, пока строки в файле не содержат символов, из-за которых >> разделяется, как пробельные символы.

Попробуйте просто использовать std::getline, чтобы пропустить форматированный ввод ина самом деле убедитесь, что вы получили действительную запись перед индексацией:

    if(fin) {
        while(std::getline(fin, line)) {
            record.clear();
            stringstream s(line);

            while(std::getline(s, word, ',')) {
                record.push_back(word);
            }

            // check that you've got a valid record
            if(record.size() != 11)
                throw std::runtime_error("invalid record size (" +
                                         std::to_string(record.size()) + ")");

            if(CRN == record[0] && Password == record[10]) {
                found = true;
                cout << "\nLogin successful!\n\n";
                break;
            }
        }
        if(!found) {
            cout << "\nWrong CRN and password entered\n\n";
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...