1

我编写了一个 c++ 程序来处理数据文件。但是,在 100 个文件中的 5 个文件中,字符串流无法到达文件末尾。我在以下代码块中运行了测试:

// ssFile contains the whole text in each file.
// chunk is a string.
// value is an int
// tId and tName are both string vectors.
loop = 0;
while(ssFile >> chunk)
{ 
        if(ssFile.eof()) cout << "\nEOF!\n" << endl;

    if( chunk == "<frame>" )
    {
        if( ! (ssFile >> value ) )
                      cout << "ssFile>>value failed" << endl;

        cout << "-> " << loop << ": " << chunk << value;
        {
            stringstream ssVal;
            if( ! (ssVal << value ))
                             cout << "ssVal<<value failed" << endl;
            tId.push_back(ssVal.str());
        }
        loop++;
        if( ! (ssFile >> chunk ))
                     cout << "ssFile>>chunk2 failed" << endl;

        tName.push_back(chunk);
        cout << "= " << chunk << endl;
    } 
}// while (ssFile >> chunk)

在这 5 个特定文件中,ssFile 流根本没有结束:循环无限执行。我检查了这些 txt 文件,但它们的结尾似乎与其他文件没有什么不同。它是否来自字符串流(我对此表示怀疑)?或者更有可能来自这些文件?如果是这样,文件结尾字符如何表示,也许这些文件缺少一个?

编辑:添加了 EOF 测试和以下输出:

-> 1: <frame>1= flying
-> 2: <frame>2= flying
-> 3: <frame>3= flying
-> 4: <frame>4= flying
-> 5: <frame>5= flying
-> 6: <frame>10= hiting
-> 7: <frame>11= hiting
-> 8: <frame>12= hiting
-> 9: <frame>13= hiting
-> 10: <frame>20= hit
-> 11: <frame>21= hit
-> 12: <frame>22= hit
-> 13: <frame>23= hit
-> 14: <frame>30= rebounding
-> 15: <frame>31= rebounding
-> 16: <frame>32= rebounding
-> 17: <frame>33= rebounding

EOF!

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

实际上循环没有再次执行,程序恰好卡在最后一次发生......所以没有无限循环/输出。似乎检测到文件结尾,但程序仍然没有退出循环。然后它告诉我分配错误。

最后编辑:

经过无数小时的调试,我找到了与循环无关的错误。基本上,一旦文件被读取一次,我就会清除 sstream 并将文件包含再次放入,所以这就像重新打开文件一样。然后我使用 sstream >> char,逐个读取每个字符。我首先在循环中定位下一个非空白字符。完成后,我将再次循环以结束单词。然后,由于我对接下来的值很感兴趣,所以我执行相同的循环,这就是我的错误:我假设某些东西遵循第一个模式,而没有检查 sstream.eof() 值。下面是一段代码供大家理解:

 // 2nd reading.
  ssFile.unsetf(std::ios::skipws); // consider whitespaces
  while( !ssFile.eof() && ssFile >> c ) {

   if(c != ' ' && c != '\n') { // until gets 1 char

    while( !ssFile.eof() && c != ' ' && c != '\n' ) {
     pattern += c;
     ssFile >> c;
    }

    if( pattern == "<frame>" || pattern == "next:" || pattern == "hit_a:" || pattern == "hit_d:" || pattern == "hit_j:" || pattern == "hit_Fa:" || pattern == "hit_Ua:" || pattern == "hit_Da:" || pattern == "hit_Uj:" || pattern == "hit_Dj:" || pattern == "hit_Fj:" || pattern == "hit_dja:") {


     do { // Search next first char.
      ssFile >> c;
     } while ( !ssFile.eof() && c == ' ' && c == '\n' );

在每个循环中,我都在条件中添加了 !ssFile.eof() 。有我的错误。

所以我的问题已经解决了,并且绝对与我的问题的标题无关,抱歉。

如果出于好奇,有人碰巧发现了我做错的事情,请不要犹豫,告诉我 :)

4

0 回答 0