c++ - 从文件中删除记录
问题描述
所以我有学生的记录,例如:
name,age,contact
name2,age2,contact2
name3,age3,contact3
任务是通过搜索名称删除记录。问题是我的代码从名称搜索开始删除了整个数据。就像,如果我必须删除 name2 的记录,数据应该是:
name,age,contact
name3,age3,contact3
但我的代码确实:
name,age,contact
因此,如果找到名称,则删除其下方的整个数据。一直被这个问题困住..这是代码:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char names[30], search[30], contact[30];
int i = 0, j = 0, age=0;
bool flag;
cout << "Enter name from records : ";
cin.ignore();
cin.getline(search, 19);
ifstream fin;
fin.open("studentinfo.txt");
ofstream fout;
fout.open("output.txt");
if (fin.is_open())
{
while (!fin.eof())
{
flag = true;
fin.getline(names, 19, ',');
fin >> age;
fin.ignore();
fin >> contact;
fin.ignore();
if (names[i] == search[j])
{
while (names[i] == search[j] && names[i] != ',' && search[j] != '\0')
{
i++;
j++;
}
if (search[j] == '\0')
{
flag = false;
}
}
else if(flag == true)
fout << names << ',' << age << ',' << contact << endl;
}
fin.close();
fout.close();
}
else
{
cout << "file not found \n" << endl;
return 0;
}
}
解决方案
您的代码中有几个问题。
第一个(也许是最明显的)是您没有在每个循环开始时重置i
并j
归零while
- 这意味着您if (names[i] == search[j])
将比较(可能)超出给定names
输入结尾的两个字符(以及search
字符串)在之后找到匹配项的所有记录上。解决方案:在每个循环开始时将 and 设置为零,方法与i
重置j
相同。(此外,我不清楚为什么在这里需要两个不同的变量:并且总是具有相同的值,所以只需使用一个并丢弃另一个)。 while
flag
i
j
第二个问题是线路else if(flag == true)
。这意味着,一旦名称的第一个字符与搜索的第一个字符匹配(if (names[i] == search[j])
即已输入相关块),您就不会将该记录写入输出文件。解决方案:去掉这个else
词——你是通过设置为false来测试是否找到了完全flag
匹配,所以你需要测试即使前面的if
块已经输入,并且没有找到完全匹配。
作为进一步的“改进”,您实际上可以在循环内声明i
、 ( j
、 )age
和flag
变量while
,在这些声明中设置它们的初始值。
推荐阅读
- java - 如何识别导致代码失败的边缘案例?
- php - 如何在注册过程中检查用户是否输入了字母数字
- flutter - Flutter 创建一个凸起的按钮
- reactjs - 您能否将脚本注入到 React 页面(使用 Draft.js 编辑器)以将 HTML 附加到编辑器的现有内容?
- azure-cosmosdb - 嵌套对象子级的 Cosmos DB SQL API 查询
- android - 工具栏隐藏其他元素 android kotlin
- xaml - 按钮在较低分辨率下转义堆栈布局
- php - 如何从 PHP post 在 virtualenv 中运行 python 脚本
- javascript - Vue.js 不会在屏幕上显示多个组件
- azure - 连接到 Dynamics 365 for Operations 的试用实例