这是我第一次使用EOF和/或文件,我遇到了代码挂起的问题,我相信这是因为我的EOF循环了太多次。

我从文件中输入内容,并以这种方式动态创建对象,并且在文件运行完毕后挂起。

        while( !studentFile.eof() )
    {
        cout << "38\n";
        Student * temp = new Student();
        (*temp).input( studentFile );

        (*sdb).insert( (*temp) );
    }

这部分代码就是有问题的代码。提示>>“38 \ n”;是行号,也是我认为它无法循环执行多次的原因。

该文件仅包含4个学生的数据,而38个文件出现了5次,所以我认为它循环了太多次了。一旦获得了最后的数据,似乎并没有注册该文件已经结束并再次循环,但是没有任何数据可输入,因此我的代码挂起了。

我该如何解决?我的逻辑正确吗?

谢谢。

最佳答案

其他人已经指出了您注意到的问题的详细信息。

但是,您应该意识到,还有更多尚未发现的问题。一个是相当明显的内存泄漏。循环的每次迭代都会执行:Student * temp = new Student();,但是您永远不会执行匹配的delete

C++使内存管理比其他一些语言(例如Java)要简单得多,后者要求您对使用的每个对象进行new。在C++中,您可以定义一个对象并使用它:

Student temp;

temp.input(studentFile);

这简化了代码并消除了内存泄漏-您的Student对象将在每次迭代结束时自动销毁,并(在概念上)在下一次迭代开始时创建一个新的/不同的对象。

尽管它本身并不是真正的错误,但仍可以将其简化很多。由于sdb指向的任何对象显然都具有insert成员函数,因此您可以像使用标准容器一样使用它(实际上可能是,尽管这两种方式都没有关系)。要整理代码,请首先为Student编写提取运算符:
std::istream &operator>>(std::istream &is, Student &s) {
    s.input(is);
    return is;
}

然后,您可以将数据从流复制到集合中:
std::copy(std::istream_iterator<Student>(studentFile),
          std::istream_iterator<Student>(),
          std::inserter(*sdf));

请注意,这可以自动正确处理EOF,因此您完全不必像开始时那样处理问题(即使您想引起这些问题,也并非易事)。

关于c++ - C++ EOF运行太多次了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8236006/

10-13 08:33