чтение файла и токенизация данных для сравнения с вводом в C ++ - PullRequest
0 голосов
/ 24 февраля 2012

можете ли вы помочь мне с этим .. я пытаюсь добиться того, чтобы, когда пользователь вводит свое имя пользователя и пароль, моя программа затем открывает файл, в котором хранится информация о пользователях, упорядоченная по строке имя пользователя, пароль, имя пользователя, полное имя пользователя). У меня есть этот код, но я не вижу проблемы. Когда у ввода должен быть результат первой строки, он получает его. Но когда он разбирает вторую строку, он вылетает. Может ли кто-нибудь помочь мне с этим?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

main () {
//  string toks[]; 
  char oneline[80],*del;
  string line, creds[3], username, password;
  int x = 0;
  cout<<"Enter Username: ";
  cin>>username;
  cout<<"Enter Password: ";
  cin>>password;
  ifstream myfile;
   myfile.open("jake.txt");
  if (myfile.is_open())
  {

    while (!myfile.eof())
    {
     getline(myfile,line);
     strcpy(oneline,line.c_str());
     del = strtok(oneline,",");
     while(del!=NULL)
     {
     creds[x] = del;
     del = strtok(NULL,",");
     ++x;
     }
     if((creds[0]==username)&&(creds[1]==password))
        {
         cout<<creds[2]<<endl;
         break;
         }
    }
    myfile.close();
  }
  else 
  cout << "Unable to open file"; 

  system("pause");
}

1 Ответ

0 голосов
/ 24 февраля 2012

возможно, вы переполняете буфер oneline .Вместо того, чтобы использовать фиксированный размер, просто используйте std :: string, как вы делаете для других переменных.т. е.

string oneline;
...
oneline = line;
...

и использование токенайзера повышения для разделения на запятую вместо strtok

edit : пример использования, адаптированный из документов повышения

#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int tokenizer_main(int, char **){
   using namespace std;
   using namespace boost;
   string s = "This,is,a,test";
   tokenizer<> tok(s);
   for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}

выходы

This
is
a
test
...