这是我第一次使用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/