大A和小Q 2020-05-21 22:15 采纳率: 0%
浏览 173

请问银行账户管理系统(利用二进制存储文件)为什么输出时,账号以外的信息带上了账号的最后一个数字?

图片说明
这是传入二进制文件的show1函数和读取信息的show2函数,希望能得到大佬的帮助

void show1() {
    //获取初始化信息
    cout << "请输入账号:";
    string acNumber;
    cin >> acNumber;
    cout << "请输入用户名:";
    string name;
    cin >> name;
    cout << "请输入身份证号:";
    string id;
    cin >> id;
    cout << "请输入地址:";
    string addr;
    cin >> addr;
    cout << "请输入存款金额:";
    double sumOfMonney;
    cin >> sumOfMonney;
    //cout << "请设置账户密码:";
    string p;
    p = getPassword();
    //产生账户
    Account newaccount(acNumber, id, name, addr, sumOfMonney, p);

    //打开二进制文件存储账户
    string fname = "storeInfo";
    fstream fs(fname, ios::binary | ios::out);
    if (!fs) {
        cout << "存储文件打开失败" << endl;
    }
    //acNumber
    int len = newaccount.getAcNumber().length();
    fs.write((char*)&len, sizeof(int));
    fs.write(newaccount.getAcNumber().c_str(), len);
    //id
    len = newaccount.getID().length();
    fs.write((char*)&len, sizeof(int));
    fs.write(newaccount.getID().c_str(), len);
    //name
    len = newaccount.getName().length();
    fs.write((char*)&len, sizeof(int));
    fs.write(newaccount.getName().c_str(), len);
    //addr
    len = newaccount.getAddr().length();
    fs.write((char*)&len, sizeof(int));
    fs.write(newaccount.getAddr().c_str(), len);
    //sumOfMonney
    double s = newaccount.getSumOfMonney();
    fs.write((char*)&s, sizeof(double));
    //password
    len = newaccount.getPassword().length();
    fs.write((char*)&len, sizeof(int));
    fs.write(newaccount.getPassword().c_str(), len);
    //state
    bool state = true;
    fs.write((char*)&state, sizeof(bool));
    //关闭文件
    fs.flush();
    fs.close();
    cout << "新建账户成功!" << endl;
}
//读取账户信息
void show2() {
    //根据信息索引用户账号
    cout << "请输入您的账号:" << endl;
    string num;
    cin >> num;
    fstream fs("storeInfo", ios::binary | ios::in);
    if (!fs) {
        cout << "读取账户信息失败,请确保已建立账户。" << endl;

    }
    Account a;
    //判断文件是否索引完毕
    while (!fs.eof()) {
        char buffer[100] = { 0 };
        int len = 0;
        //acNumber
        fs.read((char*)&len, sizeof(int));
        fs.read(buffer, len);
        a.setAcNumber(buffer);
        //id
        fs.read((char*)&len, sizeof(int));
        fs.read(buffer, len);
        a.setID(buffer);
        //name
        fs.read((char*)&len, sizeof(int));
        fs.read(buffer, len);
        a.setName(buffer);
        //addr
        fs.read((char*)&len, sizeof(int));
        fs.read(buffer, len);
        a.setAddr(buffer);
        //sumOfMonney
        double monney = 0;
        fs.read((char*)&monney, sizeof(double));
        a.setSumOfMonney(monney);
        //password
        fs.read((char*)&len, sizeof(int));
        fs.read(buffer, len);
        a.setPassword(buffer);
        //state
        bool state =true;
        fs.read((char*)&state, sizeof(bool));
        fs.read(buffer, len);
        a.setState(buffer);
        //找到用户账号
        if (a.getAcNumber() == num) {
            //根据密码保护用户账户
            for (int i = 0;i < 3;i++) {
                cout << "请第" << i + 1 << "次输入密码(仅能输入三次):";
                string p;
                p = getPassword();
                //密码输入正确,显示用户信息
                if (p == a.getPassword()) {
                    a.showInfo();
                    fs.close();

                    return;
                }
                //输入错误,还有输入机会
                else {
                    if (i < 2)
                        cout << "密码错误,请重新输入。" << endl;
                }

            }
            //输入次数用完,回到主菜单
            cout << "密码不正确。";

            return;
        }

    }
    //未索引到该账号
    cout << "此账户不存在,请注册" << endl;


}
  • 写回答

2条回答 默认 最新

  • threenewbee 2020-05-21 22:38
    关注

    所有的len都要写成len+1,需要一个\0截断字符串

    评论

报告相同问题?

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错