Ifstream卡在一个单词上,创建一个无限循环

时间:2016-07-21 12:37:44

标签: c++ infinite-loop ifstream

我正在编写一个从txt文件中收集数据的代码。为了得到下一个有趣的数字,我使用了一个do-while循环。但是,第一个do-while循环完美地工作,但在第二个循环中,ifstream myfile卡在单词Pmax上。不知道原因是什么。 = /

以下是解析器的有趣部分(即使看起来有点像我也不使用XML):

ifstream myfile; 
string comment;
const string filename = "data";
myfile.open(filename.c_str());

do{
    myfile>>comment;
} while (comment != "</probScen>");
for (int i=0;i<numberScen;i++){
    myfile>>comment;
    double prov;
    myfile>>prov;
    probScen.push_back(prov);
}

do{
    if(myfile.eof()){cout<<"EoF reached"<<endl;}
    myfile>>comment;
} while (comment != "</Pmax>");
for (int i=0;i<H;i++){
    myfile>>comment;
    double prov;
    myfile>>prov;
    Pmax.push_back(prov);
}

这是我想要阅读的txt文件的一部分:

<probScen> scenario s - happening probability </probScen>
1 1
<Pmax> hour h - max price for this hour </Pmax>
1 5

第一个do-while循环处理probScen很好,但第二个do-while中的myfile卡在Pmax上,因此创建了一个无限循环。更确切地说,myfile读取每个单词,直到/ probScen,然后是1,1,Pmax,但之后不再继续。 myfile.eof()永远不会返回true。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

一旦numberScen大于1(一),就会出现问题!

第一次迭代:

for (int i = 0; i < numberScen; i++)
{
    myfile>>comment; // consumes 1
    double prov;
    myfile>>prov;    // consumes 1
    probScen.push_back(prov);
}

第二次迭代:

for (int i = 0; i < numberScen; i++)
{
    myfile>>comment; // consumes <Pmax>
    double prov;
    myfile>>prov;    // trying to parse 'hour', but fails!
                     // from now on, fail bit is set
    probScen.push_back(prov); // stores uninitialized value
}

在下面的while循环中,当设置了失败位时,根本不会读取任何内容,因此注释仍保留在最近消耗的&#34;&#34; ...