You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++登录功能无法读取文件,始终提示账号或密码错误求助

问题排查与解决方案

首先直接回答你的参数疑问:

  • 是的,ios::app(或者你用的fstream::app)确实是ofstream的追加模式参数,它会让新写入的内容追加到文件末尾,而非覆盖原有内容。
  • ifstream是只读流,默认行为就是从文件开头读取内容,不存在“追加”这类针对写入的参数,所以不需要类似设置。

接下来看你遇到的登录失败问题,核心是两处代码逻辑bug:

1. 注册时的文件写入格式错误

你在注册流程中写完密码后没有添加换行符,导致多次注册的用户信息会粘连在一起。比如第一次注册user1和pass1,文件内容是:

user1
pass1

第二次注册user2和pass2后,文件会变成:

user1
pass1user2
pass2

这种情况下,读取时会把pass1user2当成用户名,自然和用户输入的正确用户名不匹配。

修复方法:在写入密码后添加换行符,保证每个用户的用户名和密码各占一行:

g<<regName<<"\n";
g<<regPassword<<"\n";

2. 登录时只读取了第一组用户数据

你的登录代码仅调用两次getline就关闭了文件,意味着永远只会对比第一个注册的用户信息,后续注册的用户完全没被纳入判断逻辑。

修复方法:循环读取文件中的每一组用户名和密码,直到找到匹配项或读取完整个文件:

修改后的登录部分代码:

if (command == 2) {
    ifstream f("Registration.txt");
    if (!f.is_open()) {
        cout<< "could not open file \n";
        return 0;
    }
    bool loginSuccess = false;
    string name, password;
    cout<< "\n\n\n"<< "Enter username: ";
    cin>>inName;
    cout<< "Enter password: ";
    cin>> inPassword;

    // 循环遍历所有注册用户信息
    while (getline(f, name) && getline(f, password)) {
        if (inName == name && inPassword == password) {
            cout << "\n\n\nLOGIN SUCCESSFUL! \n\n\n Welcome!"<< inName;
            loginSuccess = true;
            break;
        }
    }
    f.close();

    if (!loginSuccess) {
        cout<< "INCORRECT USERNAME OR PASSWORD";
    }
}

另外,原代码中登录环节的内层while(1)会无限循环提示错误,直到输入第一个用户的信息,现在改成读取所有用户后判断是否成功,逻辑更合理。

修正后的完整代码

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
    int command;
    string name,password,inName, inPassword,regName,regPassword;
    while(1) {
        cout<< " 1. REGISTER \n 2. LOGIN \n 3. EXIT" <<"\n\n";
        cout<< "ENTER YOUR COMMAND NUMBER: \n";
        cin>>command;
        if (command==3) {
            return 0; // 改为0更符合常规成功退出的返回值
        }
        if (command == 1) {
            ofstream g("Registration.txt", ios::app); // 用ios::app更明确,和fstream::app效果一致
            if (!g.is_open()) {
                cout<< "no such file exists \n";
                return 0;
            }
            cout<< "\n\n\n Enter new username: ";
            cin>> regName;
            cout<< "\n New Password: ";
            cin>> regPassword;
            g<<regName<<"\n";
            g<< regPassword<<"\n"; // 添加换行符分隔用户信息
            g.close();
            cout << "Registration successful!" << endl; // 增加注册成功提示
        }
        if (command == 2) {
            ifstream f("Registration.txt");
            if (!f.is_open()) {
                cout<< "could not open file \n";
                return 0;
            }
            bool loginSuccess = false;
            cout<< "\n\n\n"<< "Enter username: ";
            cin>>inName;
            cout<< "Enter password: ";
            cin>> inPassword;

            while (getline(f, name) && getline(f, password)) {
                if (inName == name && inPassword == password) {
                    cout << "\n\n\nLOGIN SUCCESSFUL! \n\n\n Welcome!"<< inName;
                    loginSuccess = true;
                    break;
                }
            }
            f.close();

            if (!loginSuccess) {
                cout<< "\nINCORRECT USERNAME OR PASSWORD";
            }
            cout << endl;
        }
    }
    return 0;
}

修改后,注册的用户信息会按每行一个条目规整存储,登录时会遍历所有已注册用户进行匹配,就能正常完成登录流程了。

内容的提问来源于stack exchange,提问作者Jini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:03:53