从文件中删除

时间:2016-03-04 21:27:27

标签: c++

如果我在文件中有客户记录,如果我有两个客户名称john doe但我们有不同的电话号码,如何从该文件中删除客户记录。基本上我想知道如何使用姓名和电话号码从文件中删除客户记录。这是我的代码。

void deleteCustomerData() {
  string name, customerInfo, customerData;
  string email;
  string phoneNumber;
  string address;
  string deleteCustomer;

  int skip = 0;

  cout << "Enter the name of the Customer record you want to delete: " << endl;
  getline(cin, name);
  cout << "Enter the phone number of the Customer record you want to delete: " << endl;
  getline(cin, customerData);

  ifstream customerFile;
  ofstream tempFile;
  int tracker = 0;
  customerFile.open("customer.txt");
  tempFile.open("tempCustomer.txt");

  while (getline(customerFile, customerInfo)) {
    if ((customerInfo != name) && !(skip > 0)) {
      if ((customerInfo != "{" && customerInfo != "}")) {
        if (tracker == 0) {
          tempFile << "{" << endl << "{" << endl;
        }
        tempFile << customerInfo << endl;

        tracker++;
        if (tracker == 4)
        {
          tempFile << "}" << endl << "}" << endl;
          tracker = 0;
        }
      }
    }
    else
    {
      if (skip == 0)
        skip = 3;
      else
        --skip;
    }
  }
  cout << "The record with the name " << name << " has been deleted " << endl;
  customerFile.close();
  tempFile.close();
  remove("customer.txt");
  rename("tempCustomer.txt", "customer.txt");
}

2 个答案:

答案 0 :(得分:0)

假设客户记录是您文件中的一行,您需要:

  1. 分配内存以读入文件。
  2. 将文件读入内存。
  3. 修改内存。
  4. 使用修改后的内容覆盖文件。
  5. 释放您分配的内存。

答案 1 :(得分:0)

我不知道OP的文件格式,所以我必须从事普遍性工作。

定义客户结构

struct customer
{
    string name;
    string email;
    string phoneNumber;
    string address;
};

写入读取客户的功能,如果不能,则返回false。如果使用类似于以下的函数重载>>运算符,可能最简单:

std::istream & operator>>(std::istream & in, customer & incust)

编写函数来写出客户,如果不能,则返回false。同样,如果您重载<<运算符,则最简单。

std::ostream & operator<<(std::ostream & out, const customer & outcust)

使用流运算符可以利用流的布尔运算符来判断读取或写入是否成功。

然后使用读写功能实现以下功能:

while read in a complete customer from input file
    if customer.name != deletename or customer.phoneNumber!= deletenumber 
        Write customer to output file 

英文:只要我能从输入文件中读取客户,如果客户不是我想删除的客户,我会将客户写入输出文件。

使用重载的流运算符,这可以像

一样简单
customer cust;
while (infile >> cust)
{
    if (cust.name != deletename || cust.phoneNumber != deletenumber)
    {
        outfile << cust;
    }
}

所有&#34;大脑&#34;在读写功能中,选择逻辑很简单。客户匹配并且未写入文件或不匹配并写入文件。

所有读写逻辑都与选择逻辑分离,可以轻松地重复用于多种不同类型的搜索。

但是你可能会发现缓存,读入一次以及构建std::vectorcustomer以便进行操作而无需不断读取和重写文件。