FilePointer陷入无限循环

时间:2017-12-14 21:36:44

标签: c++ loops io infinite

大家好,我似乎陷入了无限循环,不能为我的生活找出原因,

我从我测试的文件中读取并确保personStart等于447,同时通过一些调试我可以确认in.tellg()等于7

它似乎第一次工作但是在它打印从8447的所有索引之后它会陷入无限循环并继续打印-1(文件指针值)

**编辑 当我删除第二个while循环时,它仍然可以正常工作并终止,所以它不是第一个while循环的问题(也不是重复,也不知道为什么它会被downvoted)

好的我会编辑问题和代码以便它完整但我对这个问题非常恼火被标记为重复,因为上述问题并没有帮助我最轻微的,所以我创建了一个txt文件,使用索引随机访问现在我遇到了一个问题,当我尝试从该txt文件读取时,我陷入无限循环,我已经测试了其他代码在一个嵌套的while循环中它运行完美,如果有人可以提出为什么它可能会发生以及这里有什么问题我会非常感激。

#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
   vector<Person> people;
   map<int,Index> index;
   stringstream ss;

   ifstream in;
   in.open("randomAccess.txt");
   int hello = 6;

   while(!in.eof()){

       string size;
       getline(in,size,':');
       string personStartString;
       getline(in,personStartString,':');
       int personStart;
       ss << personStartString;
       ss >> personStart;
       ss.str(string()); // clear string stream
       ss.clear();

       while(in.tellg() < personStart){

           string indexString;
           getline(in,indexString,':');
           int indexNumber;
           ss << indexString;
           ss >> indexNumber;
           cout << in.tellg() << endl;
           if ( in.fail() ){

              cout << "failed" << endl;

           }
       }
   }

1 个答案:

答案 0 :(得分:1)

您的代码使用我C++ antipatterns的前两个:

<强> Reading from an istream without checking the result

<强> Testing for istream.eof() in a loop

它永远循环的原因是第一个:你正在从文件中读取但不检查是否有效。如果您的输入文件包含"1:2:3:4:5:6:7",那么它具有奇数个字段,因此您读取大小但不是personStart,然后进入内部循环并且永远不会离开它,因为该循环中的所有I / O操作失败。

不要在流中使用eof(),这不是正确的条件。您应该检查输入操作是否成功,而不是在您到达文件末尾时(因为如果操作失败,流将进入失败状态并且永远不会达到EOF)。 / p>