Почему он может читать только первую строку? - PullRequest
0 голосов
/ 07 ноября 2018

Я новичок в C ++. Это часть задания в школе. Это часть входа в систему.

Мне нужно прочитать PIN-код из внешнего файла, который состоит из PIN-кода многих пользователей.

Мне нужно сравнить пин-код, который пользователь только что набрал, с пин-кодом, сохраненным в файле. Если пин-код совпадает, то пользователь успешно авторизован. Если нет, то у пользователя есть еще 2 попытки ввести PIN-код еще раз.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу прочитать данные из других строк, кроме первой.

Когда я ввел PIN-код других строк, которые верны, программа всегда будет показывать мне неправильный PIN-код. Только если я наберу первую строку, он покажет правильный PIN-код.

Пожалуйста, помогите мне выяснить проблему. Спасибо.

069906

777329

143003

069021

void olduser ()
{
int userpin,a;
cout << "*************************************************************" << 
endl << endl;
input.open("userdata.txt");
cout << "Please enter your PIN." << endl;
cin>>userpin;

if(input.is_open())
    {   
    while(input >> pin) 
    {

     if(userpin == pin) //compare the pin typed in with the pin in file
        {   
        cout << "You have entered the correct PIN." << endl <<endl;
        cout << "You have successfully login." << endl <<endl;
        cout << "Redirecting......" << endl;
        system("pause");
        break;
            }
    else if (userpin != pin)
        {
         for(a=1;a<=2;a++)
          { 
           cout << "You have entered the wrong PIN." << endl;
           cout << "Please try again." << endl;
           cin >> userpin;

           if(userpin == pin)
           {    
             cout << "You have entered the correct PIN." << endl <<endl;
             cout << "You have successfully login." << endl <<endl;
             cout << "Redirecting......" << endl;
             system("pause");
             break;
             }

            }           
        system("cls");
        cout << "The PIN you have entered has no match." <<endl <<endl; 
        cout << "Please try again later. Thank you." << endl << endl;
        cout << "Exiting IVM......" << endl;
        system("pause");
        break;                      
        }   
        }
        }
   else
    {
        cout << "Unable to open file." << endl;

     }  

    }

int attempts = 0;
   while (attempts < 3)
   {
    bool logged = false;
    if (input.is_open())
    {
        while (input >> pin)
         {
            if (userpin == pin)
            {
            //if the PIN is found in the external file

            cout << "You have successfully login." << endl << endl;
            cout << "Redirecting to main menu......" << endl;
            system("pause");
            logged = true;
            mainmenu();
            }
        }
    }
   else
   {
    //If the external file cannot be opened
    cout << "Unable to open file." << endl;
    break;
   }
     if(logged) break; 
     {
    //if the PIN is not found in the external file
   cout <<"The PIN is not matched. Please try again." << endl;
   cin>>userpin;
   }
    attempts++;
    }
   if(attempts == 3)
   {
   //the login is unsuccessful after using up 2 attempts
    cout <<"Your PIN is not matched. Please try again next time." <<endl 
   << endl;
    }

1 Ответ

0 голосов
/ 07 ноября 2018

Ответ прост: все возможные пути вашего кода приводят к разрыву цикла while в первой итерации, поэтому он не будет читать больше, чем просто первая строка из input.

Кроме того, из-за вышеизложенного, внутри вашего else if (userpin != pin) ваш цикл for всегда будет проверять наличие одного и того же pin.

Пример решения:

int loginAttempts = 0;
while (loginAttempts < 3)
{
    //Prepare file to reading
    bool logged = false;
    if (input.is_open())
    {
        while (input >> pin)
        {
            if (userpin == pin)
            {
                //Handle successful login attempt
                logged = true;
                break;
            }
        }
    }
    else
    {
        //Handle file openning failure
    }
    if(logged) break;
    //Handle unsuccessful login attempt
    loginAttempts++;
}
if(loginAttempts == 3)
{
    //Handle unsuccessful login
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...