2015-01-28 16 views
3

Этот цикл никогда не заканчивается. Например, когда я ввожу неверный пароль, он снова и снова будет переходить к разделу «неправильный пароль».Как остановить цикл while

Logo(); 
inFile.open("UsernamePassword.txt"); 
if (!inFile) 
    cout << "Unable to Open File"; 
else 
{ 
    cout << endl << endl << endl; 
    cout << "   Please enter username: "; 
    cin >> user; 
    cout << "   Please enter password: "; 
    cin >> pass; 

    while (username != user) 
    { 
     inFile >> username >> password; 

     if (user == username && pass == password) 
     { 
      cout << endl; 
      cout << "Welcome to CherryLunch!" << endl; 

      system("pause"); 
      system("cls"); 

      MainMenu(); 

     } 
     else 
     {   
      cout << endl; 
      cout << "   Invalid Username or Password!" << endl << endl; 
      system("pause"); 
      system("cls"); 
     } 
    } 
} 
inFile.close(); 
+1

Что вы пытаетесь сделать? Хотите ли вы предоставить пользователю дополнительные шансы ввести совпадающее имя пользователя и пароль или прекратить работу программы после неудачной попытки? Вы пытаетесь поддерживать файл UsernamePassword.txt с несколькими именами пользователей (и паролями), или он просто будет содержать одно имя пользователя, которое должно соответствовать? –

+0

Да, когда пользователь вводит неправильное имя пользователя или пароль, я хочу дать пользователю дополнительные шансы ввести имя пользователя и пароль.Да, я пытаюсь поддерживать файл UsernamePassword.txt с несколькими именами пользователей (и паролями). –

ответ

1

Цикл while бесконечен, потому что вы никогда не позволяете пользователю вводить новый пароль или имя пользователя. Когда оператор if завершится с ошибкой, он вернется в заголовок цикла (где он все равно будет не так) и продолжит движение вперед.

Дайте пользователю возможность ввести новый комманда user/pass, а затем цикл может быть конечным (при условии, что пользователь в конечном итоге предоставит правильные учетные данные).

0

Подведите соиЬ и CIN заявления внутри время цикла:

else 
{ 

    while (username != user) 
    { 
     cout << endl << endl << endl; 
     cout << "   Please enter username: "; 
     cin >> user; 
     cout << "   Please enter password: "; 
     cin >> pass; 
     inFile >> username >> password; 

     if (user == username && pass == password) 
     { 
      cout << endl; 
      cout << "Welcome to CherryLunch!" << endl; 

      system("pause"); 
      system("cls"); 

      MainMenu(); 

     } 
     else 
     {   
      cout << endl; 
      cout << "   Invalid Username or Password!" << endl << endl; 
      system("pause"); 
      system("cls"); 
     } 
    } 
} 
inFile.close(); 
0

Он держит на бесконечном цикле, потому что вы никогда не спросить, если вы достигли конца файла, поэтому, если файл не содержит username/password комбинация, которая соответствует паре, введенному пользователю, когда конец файла достигнут, то строка:

inFile >> username >> password; 

терпит неудачу и username и password будут содержать последние записи увиденных на UsernamePassword.txt, и цикл продолжается вечно.

Следующая реализация вашей программы будет проверить на eof в inFile файле объекта:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <cstdlib> 
int main() { 
    std::ifstream inFile;  

    std::string user, pass; 
    std::string username, password; 

    inFile.open("UsernamePassword.txt"); 
    if (!inFile) { 
     std::cout << "Unable to Open File"; 
    } else { 
     std::cout << std::endl << std::endl << std::endl; 
     std::cout << "   Please enter username: "; 
     std::cin >> user; 
     std::cout << "   Please enter password: "; 
     std::cin >> pass; 

     while (username != user && !inFile.eof()) { 
      inFile >> username >> password; 

      if (user == username && pass == password) { 
       std::cout << std::endl; 
       std::cout << "Welcome to CherryLunch!" << std::endl; 

       // Equivalent to the 'pause' command in linux 
       system("read -p 'Press any key to continue...' key"); 
       // Equivalent to the 'cls' command in linux 
       system("clear"); 

       // MainMenu(); 
      } else {   
       std::cout << std::endl; 
       std::cout << "   Invalid Username or Password!" << std::endl << std::endl; 

       system("read -p 'Press any key to continue...' key"); 
       system("clear"); 
      } 
     } 
    } 
    inFile.close(); 
} 
0

Вы пытаетесь проверить имя пользователя и пароль от пользователя и сравнить со всеми именами пользователей и паролями в файл.
Ваш подход кажется прекрасным. Но после каждого сравнения вы печатаете «Недопустимое имя пользователя ...», не сравнивая все имена пользователей в файле. Следовательно, переместите этот вывод за пределы else block и поместите его в цикл while.

infile проверяет каждую линию отдельно.

А также проверить конец file.If имя пользователя и пароль не найдены до конца файла, а затем распечатать «Invald имя пользователя» и предоставить пользователю ввести другой набор имя и пароль

Надежда этом помогает !!

0

Сначала прочтите правильные имена пользователей и пароли из файла и сохраните их в памяти. Таким образом, если проверка имени пользователя и пароля не выполняется в первый раз, вам не нужно повторно открывать или искать в начале файла, прежде чем проверять следующее имя пользователя/пароль, введенный пользователем.

std :: map usernames_passwords; std :: string имя пользователя, пароль;

if (ifstream in("UsernamePassword.txt")) 
    while (in >> username >> password) 
     usernames_passwords[username] = password; 
else 
{ 
    std::cerr << "Unable to open username/password file\n"; 
    exit(EXIT_FAILURE); 
} 

Затем запрашивает регистрационные данные, пока они не действительны:

bool logged_in = false; 
while (!logged_in && 
     std::cout << "\n\n\n Please enter username: " && 
     std::cin >> username && 
     std::cout << " Please enter password: " && 
     std::cin >> password) 
{ 
    // look for a match in the earlier-read login details... 
    auto it = usernames_passwords.find(username); 
    logged_in = it != std::end(usernames_passwords) && it->second == password; 
} 

// the while loop could also exit because "cin >>" failed, indicating EOF 
// that could be because the user typed e.g. ^D (UNIX) or ^Z (Windows), or 
// input was from a redirected file or pipe or over a network connection... 

if (!logged_in) 
{ 
    std::cerr << "error reading login details from stdin\n"; 
    exit(EXIT_FAILURE); 
} 

...ok - we know the username/password are good - do whatever else...