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

图片说明
这是传入二进制文件的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;


}

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

不看代码 直接分析 原因 有可能你用的数组重复了 打印时候没有清0 就导致把最后一位带出来了