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

C++银行程序代码问题:如何删除文件中指定账户信息?

银行账户删除功能故障排查与修复

问题背景

我正在开发一款银行程序,程序读取的文件数据格式为(account number、SSN、姓名、地址、电话号码),需要实现删除指定用户全部信息、保留其他账户信息的功能。编写的deleteUser函数如下,但运行后没有任何效果:

// clientAccount = user-inputted id Number of account to delete
void deleteUser(int& accIndex, string & clientAccount)
{
    
    string  accountNumT[TOTAL_ACCOUNTS],
        userSSNT[TOTAL_ACCOUNTS], clientNameT[TOTAL_ACCOUNTS],
        userAddressT[TOTAL_ACCOUNTS], phoneNumberT[TOTAL_ACCOUNTS];
    ifstream fin(ACCOUNTS_FILE); 
    ofstream fout(ACCOUNTS_FILE);
    for (int i = 0; i < TOTAL_ACCOUNTS; i++) 
    {
        getline(fin, accountNumT[i]);
        getline(fin, userSSNT[i]);
        getline(fin, clientNameT[i]);
        getline(fin, userAddressT[i]);
        getline(fin, phoneNumberT[i]);
        if (clientAccount == accountNumT[i]) 
        {
            accountNumT[i] = " ";
            userSSNT[i] = " "; 
            clientNameT[i] = " ";
            userAddressT[i] = " ";
            phoneNumberT[i] = " ";
        }
        fout << accountNumT[i] << endl; 
        fout << userSSNT[i] << endl;
        fout << clientNameT[i] << endl;
        fout << userAddressT[i] << endl;
        fout << phoneNumberT[i] << endl;
    }
}

核心问题分析

  1. 文件打开模式冲突:同时用ifstream和ofstream打开同一个文件时,ofstream默认会截断文件(清空原有内容),导致fin根本读不到任何原有数据,自然无法处理和写入有效内容。
  2. 错误的“删除”逻辑:用空格替换信息不是真正的删除,会留下无效的空行,后续程序读取数据时会出现格式混乱,而且原账户的位置依然被占用。
  3. 固定数量的遍历风险:依赖TOTAL_ACCOUNTS固定值遍历,但实际文件中的账户数量可能和这个值不匹配,要么多读导致读取失败,要么少读遗漏数据。

修复后的实现方案

正确的做法是先将所有有效账户数据读取到内存,再重新写入文件(跳过要删除的账户),以下是优化后的代码:

#include <fstream>
#include <vector>
#include <string>

// 定义账户结构体,让数据管理更清晰
struct Account {
    std::string accountNum;
    std::string ssn;
    std::string name;
    std::string address;
    std::string phone;
};

void deleteUser(std::string &clientAccount) {
    std::vector<Account> accounts;
    std::ifstream fin(ACCOUNTS_FILE);
    if (!fin.is_open()) {
        // 处理文件打开失败的情况,比如打印错误日志
        return;
    }

    // 读取所有账户数据到内存
    Account acc;
    while (std::getline(fin, acc.accountNum) &&
           std::getline(fin, acc.ssn) &&
           std::getline(fin, acc.name) &&
           std::getline(fin, acc.address) &&
           std::getline(fin, acc.phone)) {
        accounts.push_back(acc);
    }
    fin.close();

    // 重新写入文件,跳过要删除的账户
    std::ofstream fout(ACCOUNTS_FILE);
    if (!fout.is_open()) {
        return;
    }
    for (const auto& account : accounts) {
        if (account.accountNum != clientAccount) {
            fout << account.accountNum << std::endl;
            fout << account.ssn << std::endl;
            fout << account.name << std::endl;
            fout << account.address << std::endl;
            fout << account.phone << std::endl;
        }
    }
    fout.close();
}

关键优化点

  • 使用std::vector<Account>动态存储账户数据,不再依赖固定的TOTAL_ACCOUNTS,适配实际账户数量。
  • 先关闭读取流,再打开写入流,彻底避免文件截断冲突。
  • 直接跳过要删除的账户,不写入到文件,实现真正的删除,避免无效数据残留。
  • 用结构体封装账户信息,代码更易维护和扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:20:45