stringstream有时不会到达文件的末尾

时间:2013-08-29 12:14:46

标签: c++ eof stringstream

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

// 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 sstream完全没有结束:循环无休止地执行。我检查了这些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&gt;&gt; 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()。我的错误。

所以我的问题已经解决,而且与我的问题的标题无关,抱歉。

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

0 个答案:

没有答案