【问题标题】:Ifstream stuck on a word, creating an infinite loopifstream 卡在一个词上,造成无限循环
【发布时间】:2016-07-21 12:37:44
【问题描述】:

我正在编写一个从 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。

提前感谢您的帮助!

【问题讨论】:

  • 通过尝试以这种方式解析 XML,您将完成的唯一一件事是 http://thedailywtf.com 上的一篇专题文章。您需要使用适当的 XML 解析器库来解析 XML 文档。
  • 如果这发生在我身上(而且我没有使用 XML 解析器),我会添加调试代码来观察从 myfile 读取的每个单词。这会告诉我事情在哪里卡住了。
  • 感谢您的回答!我实际上使用了一些“cout,然后是 1 1,然后达到 并且不再继续。
  • 您可能需要检查myfile.eof() 以至少打破无限循环...myfile.fail() 可以提示您流错误。

标签: c++ infinite-loop ifstream


【解决方案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 循环中,由于设置了失败位,所以根本没有读取任何内容,因此注释保留在最近使用的 ""...

【讨论】:

  • 非常感谢,你救了我!我确定 numberScen 设置为 1,但实际上并非如此。现在这完全有道理。
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多