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

C++编写从文件中删除指定行程序无法实现功能,求问题排查方案

问题排查与修正方案

现有代码的核心问题如下:

  • 文本文件不支持原地删除指定行操作,正确逻辑需要通过临时文件中转:读取原文件所有内容,过滤掉待删除的行后写入临时文件,最后替换原文件即可。
  • Delete函数逻辑存在多处错误:
    • 将用户输入的待删除姓名存储在keyword变量中,后续又用keyword作为getline的接收缓冲区,直接覆盖了原始要匹配的关键字
    • 没有读取文件内容到存储变量,直接对全局空变量fname执行替换操作,find找不到目标时返回string::npos会直接触发程序崩溃
    • 你的存储格式是「姓名占一行、手机号占下一行」,匹配到目标姓名后需要同时跳过姓名行和对应的手机号行,否则会出现数据错位
  • 额外冗余问题:All函数中遍历fname输出每个字符的逻辑完全多余,直接输出fname即可

修正后的Delete函数代码:

void Delete()
{
  ifstream myfile("number.txt", ios::in);
  ofstream temp_file("temp.txt", ios::out);
  string target_name, current_line;
  bool skip_next = false;

  cout << "Enter Name to delete : ";
  cin >> target_name;

  if (!myfile.is_open() || !temp_file.is_open())
  {
    cout << "File open failed!" << endl;
    return;
  }

  while (getline(myfile, current_line))
  {
    if (skip_next)
    {
      skip_next = false;
      continue;
    }
    // 当前行是姓名行,和目标匹配的话跳过当前行和下一行的手机号
    if (current_line == target_name)
    {
      skip_next = true;
      continue;
    }
    // 不需要删除的行写入临时文件
    temp_file << current_line << endl;
  }

  myfile.close();
  temp_file.close();

  // 删除原文件,将临时文件重命名为原文件名
  remove("number.txt");
  rename("temp.txt", "number.txt");
  cout << "Contact deleted successfully!" << endl;
}

补充说明:

  • 如果需要支持姓名部分匹配删除,把判断条件current_line == target_name改成current_line.find(target_name) != string::npos即可
  • 操作文件前建议增加打开失败的判断,避免程序无响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:18:00