2014-12-12 3 views
0

В настоящее время я работаю над программой, в которой пользователь программы должен ввести имя пользователя и пароль, и программа выполнит поиск и проверит, есть ли такой пользователь, если он существует, затем переходить к экрану с дополнительными параметрами или повторно вводить имя пользователя.C++: чтение из файла/строки синтаксического анализа

В username.txt файлы, которые хранит имя пользователя и пароль, включает в себя следующие данные: (первый столбец имя пользователя, а второй является пароль)

john,abc 
marry,cde 
admin,admin 
joseph,1234 

Мой код выглядит следующим образом, но он не работает, после того, как i введите имя пользователя и пароль, программы автоматически закрываются. Можете ли вы мне помочь? Что-то не так с моим разбором строки на 2?

#include<iostream> 
#include<fstream> 
#include<sstream> 
#include<string> 
#include<math.h> 
#include<stdio.h> 
using namespace std; 

void printoptionsadmin(){ 
    cout << "Please select an option:" << endl; 
    cout << "1.Sell Stock\n2.Buy stock\n3.Inquiry\n4.Logout\n5.Shutdown" << endl; 
} 
void printoptions(){ 
    cout << "Please select an option:" << endl; 
    cout << "1.Sell Stock\n2.Buy stock\n3.Inquiry\n4.Logout" << endl; 
} 

void main() 
{ 

    cout << "Please login." << endl; 

    stop: 
    string usertype;//user input 
    string passtype;//user input 
    string line; 
    string manager = "admin"; 
    string managerp = "admin"; 
    string user;//read from file 
    string pass;//read from file 

    ifstream openfile("username.txt"); 
    cout << "Enter your username:"; 
    cin >> usertype; 
    cout << "Enter your password:"; 
    cin >> passtype; 

    bool found = false; 
    while (found&&getline(openfile, line)) 
    { 
     stringstream iss(line); 
     getline(iss, user, ','); 
     getline(iss,pass); 
     if (usertype == manager && passtype == managerp)//admin login 
     { 
      void printoptionsadmin(); 
      found = true; 
      break; 
     } 
     else if (usertype== user && passtype== pass)//regular login 
      void printoptions(); 
     else 
     { 
      cout << "Invalid username or password, please start over." << endl; 
      goto stop;//going back to login screen 
     } 
     openfile.close(); 
    } 

} 
+0

Вы можете прочитать на * структурного программирования *. – cybermonkey

ответ

0

Я изменил код немного, вы испортили found, плюс я удалил goto, и вы не должны явно закрыть файл, он закрывается, когда область остается (RAAI).

Я предлагаю вам добавить некоторые проверки в код (файл нормально? Читать строки нормально? ...)

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

using namespace std; 

static const string PASSWORD_FILE("username.txt"); 
static const string MANAGER_USER = "admin"; 
static const char DELIM = ','; 

void printoptionsadmin() { 
    cout << "Please select an option:" << endl; 
    cout << "1.Sell Stock\n2.Buy stock\n3.Inquiry\n4.Logout\n5.Shutdown" 
      << endl; 
} 
void printoptions() { 
    cout << "Please select an option:" << endl; 
    cout << "1.Sell Stock\n2.Buy stock\n3.Inquiry\n4.Logout" << endl; 
} 

string login() { 
    ifstream passwordFile(PASSWORD_FILE); 

    string usertype; //user input 
    string passtype; //user input 

    cout << "Enter your username:"; 
    cin >> usertype; 
    cout << "Enter your password:"; 
    cin >> passtype; 

    for (string userPasswordLine; getline(passwordFile, userPasswordLine);) { 
     stringstream ss(userPasswordLine); 
     string user, password; 
     getline(ss, user, DELIM); 
     getline(ss, password, DELIM); 
     if (user == usertype && password == passtype) { 
      return user; 
     } // if 
    } // for 

    return ""; 
} 

int main() { 
    cout << "Please login." << endl; 

    string loggedInUser; 
    while ((loggedInUser = login()) == "") { 
     cerr << "Login failed" << endl; 
    } // while 

    if (loggedInUser == MANAGER_USER) { 
     printoptionsadmin(); 
    } else { 
     printoptions(); 
    } // else 

    return 0; 
} 
0

Каждый getline() без третьего параметра прочитает новую строку и предоставит вам то, что вам здесь не нужно.

Так что используйте «" пробел как разделитель в функции getline() вместо значения по умолчанию "\ n".

Также есть ваша while loop condition is always false с found is initialized to false. Поэтому он не будет идти в то время как петля

Вот логика вам нужно,

bool found = false; 
while (found&&getline(openfile, line)) 

bool found = false; 
std::string delimiter = ","; 
while (getline(openfile, line, " "))//To read upto each " "(white space instead of next line(\n is default third parameter) 
{ 
    /* Splitting the UserName & Password using ','*/ 
    user = line.substr(0, line.find(delimiter)); 
    pass = line.substr(line.find(delimiter)+1, -1); 
    if (usertype == manager && passtype == managerp)//admin login 
    { 
     void printoptionsadmin(); 
     found = true; 
     break; 
    } 
    else if (usertype== user && passtype== pass)//regular login 
     void printoptions(); 
    else 
    { 
     cout << "Invalid username or password, please start over." << endl; 
     goto stop;//going back to login screen 
    } 
    openfile.close(); 
} 
Смежные вопросы