无法处理C++文本文件中的数据

Unable to Process Data from Text File in C++

本文关键字:数据 文件 文本 处理 C++      更新时间:2023-10-16

为什么这个程序不会注册输入的正确ID和密码?

键入的任何内容都将继续输入错误的数据,但无法识别正确的数据。

文本文件内部是 5 个 ID 和 5 个 PIN 码,格式为 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在之前的回答中所说的话后,这是我完成的更新代码。可悲的是,现在此代码在第一次尝试失败并且第二次尝试正确后无法成功登录。

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");

登录成功/失败检查的逻辑存在缺陷。首先,它们将调用未定义的行为,因为您将访问数组的未初始化元素。

如果,正如你所说,文件包含五个条目,那么在循环之后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
}
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");
}

代码正在工作,感谢您的输入并帮助约阿希姆·皮尔伯格先生!