读取文件 C++ 上的重复对象

Reading duplicated objects on files C++

我在用 C++ 为我的程序创建文件系统时遇到了一些问题。好吧,我正在创建一个新学生,如果他是我在保存文件和关闭程序之前创建的最后一个对象,它就会被复制。比如两个对象:Daniel,Paul。它只显示最后一个重复的:Daniel, Paul, Paul - 在 file.txt.

这是我的一些代码:

正在阅读文件:

ifstream file;
file.open("file.txt");

while (1)
{
Student *p = new Student();
    if (file.eof() || file.bad() || file.fail())
    {
        break;
    }

    getline(file, ALLTHESTRINGVARIABLES);
    p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;

    file >> ANOTHERVARIABLES;
    p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;

    students.push_back(p);
}
file.close();

正在写入文件:

   fstream file;
   file.open("file.txt", ios::out | ios::trunc);
      for(unsigned int i = 0; i < students.size(); i++){
         file << students[i]->VARIABLEEXAMPLE << endl;
      }
   file.close();

谢谢!!

eof()、bad()、fail() 只有在尝试从文件中读取一些字节但未成功后才会 return 为真。所以,把if验证放在getline()之后。

并且在此之后创建 Student 的新实例以避免内存泄漏。

像那样:

while (1)
{
    getline(file, ALLTHESTRINGVARIABLES);
    if (file.eof() || file.bad() || file.fail())
        break;

    Student *p = new Student();
    p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;

    file >> ANOTHERVARIABLES;
    p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;

    students.push_back(p);
}

eof() 不会 return true 直到您实际尝试读取超出文件末尾的内容,这就是您看到最后一行重复的原因。 getline 将失败并且 ALLTHESTRINGVARIABLES 将包含最近一次成功读取的值。您应该在存储新的 Student.

之前检查提取是否确实成功

由于您混合了未格式化和格式化的输入,您还应该从流中删除换行符(或您用来分隔记录的任何字符)。

将循环更改为:

if (std::ifstream file("file.txt"); file)
{
    while (std::getline(file, ALLTHESTRINGVARIABLES) >> ANOTHERVARIABLES)
    {
        // remove the newline or whatever whitespace char you use as record separator
        file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

        Student *p = new Student;
        p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;
        p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;
        students.push_back(p);
    }
}

我还建议您不要存储指针(除非您使用动态调度),而是将实际的 Student 对象存储在 std::vector<Student> 中。如果使用动态调度,则将 std::unique_ptr<Student> 存储在 vector.