Невозможно обработать данные из текстового файла в C++

Почему эта программа не регистрирует правильный ID и введенный PIN-код?

Все введенные данные будут приводить к вводу неверных данных, но правильные данные не распознаются.

Внутри текстового файла 5 идентификаторов и 5 контактных номеров в формате 5 строк по 2 столбца.

#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
    const int MAX=10, screenWidth=80;
    string A = "Welcome to ABC Bank!";
    int i=0;
    int ID[MAX], Password[MAX], pin, acc, counter=1 ,limit=2;
    cout<<setw((screenWidth-A.size())/2)<<" "<<A<<endl;
    cout<<"\nAccount ID: ";
    cin>>acc;
    cout<<"Pin: ";
    cin>>pin;

    ifstream accountFile;
    accountFile.open("AccountDetails.txt");

    if (!accountFile)
        cout<<"Unable to open requested file!";
    else
    {
        while (!accountFile.eof())
        {
            accountFile>>ID[i]>>Password[i];
            i++;
        }

        accountFile.close();

        while (acc==ID[i] && pin==Password[i])
        {
            cout<<"Login successful!\n";
            break;
        }

        while (acc!=ID[i] || pin!=Password[i])
        {
            if (counter==3)
            {
                cout<<"\nUnauthorized Access Detected. Account has been LOCKED!\n";
                break;
            }
            else
            {
                cout<<"\nWrong Account ID/Pin. Please try again!"<<" (Attempts Left:"<<limit<<")";
                cout<<"\nAccount ID: ";
                cin>>acc;
                cout<<"Pin: ";
                cin>>pin;
                counter++;
                limit--;
            }
        }   
    }

    system("pause");
}

После просмотра того, что @Joachim Pileborg сказал в своем ответе ранее, это обновленный код, который я сделал. К сожалению, теперь этот код не может успешно войти в систему после того, как 1-я попытка не удалась и 2-я попытка верна.

ifstream accountFile;
accountFile.open("AccountDetails.txt");

if (!accountFile)
    cout<<"Unable to open requested file!";
else
{
    while (accountFile>>ID[i]>>Password[i])
    {
        i++;
    }
    accountFile.close();

    bool success = false;
    for (int j=0; !success && j<i; j++)
    {
        if (ID[j] == acc && Password[j] == pin)
            success = true; 
    }
    if (success)
        cout<<"\nLogin Successful!\n";
    else
    {
        while (!success)
        {
            cout<<"\nAccount ID/Pin is incorrect. Please try again!"<<" (Attempts Left: "<<limit<<" )";
            cout<<"\nAccount ID: ";
            cin>>acc;
            cout<<"Pin: ";
            cin>>pin;
            counter++;
            limit--;
            if (counter==3)
            {
                cout<<"Unauthorized Access Detected! Account Has Been LOCKED!\n";
                break;
            }
        }
    }
}           
system("pause");

2 ответа

using namespace std;
int main()
{
const int MAX=10, screenWidth=80;
string A = "Welcome to ABC Bank!";
int i=0;
int ID[MAX], Password[MAX], pin, acc, counter=1 ,limit=2;
cout<<setw((screenWidth-A.size())/2)<<" "<<A<<endl;
cout<<"\nAccount ID: ";
cin>>acc;
cout<<"Pin: ";
cin>>pin;

ifstream accountFile;
accountFile.open("AccountDetails.txt");

if (!accountFile)
    cout<<"Unable to open requested file!";
else
{
    while (accountFile>>ID[i]>>Password[i])
    {
        i++;
    }
    accountFile.close();

    bool success = false;
    while (!success)
    {
    for (int j=0; !success && j<i; j++)
    {
        if (ID[j] == acc && Password[j] == pin)
            success = true; 
    }
    if (success)
        cout<<"\nLogin Successful!\n";
    else
    {           
        cout<<"\nAccount ID/Pin is incorrect. Please try again!"<<" (Attempts Left: "<<limit<<" )";
        cout<<"\nAccount ID: ";
        cin>>acc;
        cout<<"Pin: ";
        cin>>pin;
        counter++;
        limit--;            
    }
    if (counter==4)
        {
            cout<<"Unauthorized Access Detected! Account Has Been LOCKED!\n";
            break;
        }
    }
}           
system("pause");
}

КОД РАБОТАЕТ, Спасибо за вклад и помощь г-н Йоахим Пилеборг!

Логика проверки успешности / неудачи входа в систему неверна. Для начала они вызовут неопределенное поведение, потому что вы получите доступ к неинициализированным элементам массивов.

Если, как вы говорите, файл содержит пять записей, то после цикла i будет иметь значение 5 который является шестым элементом в массивах (после того, как вы исправите цикл чтения, в противном случае значение i будет 6).

Если затем мы пропустим первый цикл UB (неопределенное поведение), проверив успешность входа в систему, то это условие, скорее всего, никогда не будет выполнено, и это хорошо, потому что в противном случае у вас будет бесконечный цикл. Затем следует второй цикл, где вы проверяете неудачный вход в систему, где условие почти всегда будет истинным, и это приведет к бесконечному циклу.

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

bool success = false;

for (int j = 0; !success && j < i; ++j)
{
    if (ID[j] == acc && Password[j] == pin)
    {
        success = true;
    }
}

if (success)
{
    // Login successful
}
else
{
    // Login failed
}
Другие вопросы по тегам