我想删除文件中的一行,这是我的代码

时间:2013-06-13 12:26:24

标签: c++

我想删除文件中的一行,这是我的代码,它不起作用,但我经过长时间的仔细检查后无法弄清楚为什么。

/* A function to delete the pointed record. */

void S_O::delete_record (const string &id) {

  /* Read all records in a vector. */
  Temp_Info();

  /* Find the excat record. */
  vector<string>::iterator iter = std::find (temp_info.begin(), temp_info.end(), id);
  /* If find, then delete it. */
  if (iter != temp_info.end())
    temp_info.erase(iter);

  /* Re-input the records in file. */
  ofstream file;

  file.open ("StudentInfo");

  if (!file) {
      cerr << "error: unable to open input file: "
           << "file" <<endl;
  }
  for (size_t i = 0; i != temp_info.size(); i++)
    file << temp_info[i] << endl;

  /* Clear the vector. */
  temp_info.erase (temp_info.begin(), temp_info.end());

}

以下是示例文件:

姓名(Name) 学号(Id) 性别(Sex) 成绩(Score)
黄佳敏       1         女         100
李佳惠       2         女         100

这是功能:         inline void S_O :: Temp_Info(){

  /* Create a stream and a file. */
  ifstream afile ("StudentInfo");

  /* Test if the file is opened successfully. */
  if (afile.is_open()) {
    while (afile.good()) {
      string line;

      /* To read file line to line. */
      while (getline(afile, line)) {
        /* To put lines into a vector. */
        temp_info.push_back(line);
      }
    }

    /* Close the stream and save the file. */
    afile.close();
  }
}

这里有什么问题?

3 个答案:

答案 0 :(得分:1)

您应该为学生记录定义一个结构,并将数据读入此结构中。然后,您可以使用std::find_if和仿函数来搜索ID:

struct find_by_id : std::unary_function<student, bool> {
    string m_id;

    find_by_id(const string &id) : m_id(id) { }
    bool operator()(const student &s) const {
        return s.id == m_id;
    }
};

it = std::find_if(temp_info.begin(), temp_info.end(), find_by_id(id));

答案 1 :(得分:0)

你需要实现自己的find函数,从字符串中获取id,因为当读取整个字符串并保存它时,id就在字符串的中间。

尝试拥有包含每行所有信息的数据结构,因此更容易找到访问ID

答案 2 :(得分:0)

stl的find_if可能很有用

http://www.cplusplus.com/reference/algorithm/find_if/

您将获得一个完整的字符串,并且您有一个学生ID,这是您可以使用stringtokenizer获取第二列的第二列,并将其与学生ID abd进行比较返回true或false