首页 > 解决方案 > 从文件中删除记录

问题描述

所以我有学生的记录,例如:

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;
            }
}

标签: c++file

解决方案


您的代码中有几个问题。

第一个(也许是最明显的)是您没有在每个循环开始时重置ij归零while- 这意味着您if (names[i] == search[j])将比较(可能)超出给定names输入结尾的两个字符(以及search字符串)在之后找到匹配项的所有记录上。解决方案:在每个循环开始时将 and 设置为零,方法与i重置j相同。(此外,我不清楚为什么在这里需要两个不同的变量:并且总是具有相同的值,所以只需使用一个并丢弃另一个)。 whileflagij

第二个问题是线路else if(flag == true)。这意味着,一旦名称的一个字符与搜索的第一个字符匹配(if (names[i] == search[j])即已输入相关块),您就不会将该记录写入输出文件。解决方案:去掉这个else词——你是通过设置为false来测试是否找到了完全flag匹配,所以你需要测试即使前面的if块已经输入,并且没有找到完全匹配

作为进一步的“改进”,您实际上可以在循环内声明i、 ( j、 )ageflag变量while,在这些声明中设置它们的初始值。


推荐阅读