2012-05-04 45 views
2

我遇到了一些麻烦解析文件的std :: fstream的错误

文件的最后两行我想分析是:

˚F814/866/896一千百分之一千零三十五/ 989 817/965/898

[从无到有,从\ n效果]

这是我读文件:

while(!inFile.eof()) 
{ 
    inFile>>sCommand; 

    if(sCommand == L"#") 
    {} 
    else if(sCommand == L"f") 
    { 
     int iPos, iTex, iNorm; 
     iPos=iTex=iNorm = -1; 

     for(auto face=0; face<3; ++face) 
     { 
      inFile>>iPos; 
      --iPos; 
      if(inFile.peek() == L'/') 
      { 
       inFile.ignore(); 
       inFile>>iTex; 
       --iTex; 
       if(inFile.peek() == L'/') 
       { 
        inFile.ignore(); 
        inFile>>iNorm; 
        --iNorm; 
       } 
      } 

      objVertexIndex iObj; 
      iObj.iPos=iPos; 
      iObj.iTex=iTex; 
      iObj.iNorm=iNorm; 
      this->AddVertex(iObj); 
     } 
     m_MaterialIndices_C.push_back(m_CurrentMaterial); 
    } //END IF 

    inFile.ignore(1000, '\n'); 
} //END WHILE 
inFile.close(); 

但是,我最后一行没有包含任何内容。 在文件的最后一行之前,inFile.ignore(1000, '\n');会发生,我期望std::fstream::eof()被检测到,但由于某种原因,它不是。 显然sCommand仍然是来自上一行的命令,如果一行上没有任何内容,这给我一些麻烦。

有没有办法检查这个?如果是,如何?

+1

可能的重复:http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line总之,eof()不保证在有在流中没有任何东西可以读取。只有当你真的试图读完最后它才会返回true。这意味着你需要首先读*,看看它是否成功,然后才能读取值。在'while'条件下进行读操作:'(inFile >> sCommand){...' – jrok

+0

另请阅读http://www.parashift.com/c++-faq-lite/input-output.html# faq-15.4和这个http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5 – jrok

回答

1

不是一个真正的答案,而是一个评论(我不知道如何评论)。如果您在最后一行数字为eof后有\n不会触发。我有类似的问题,使用.eof(),并可能更好地检查你阅读的内容作为一个条件来保持阅读与否。

+0

*要添加评论:*只需在当前页面中搜索“添加评论”。你会在第一击时得到它。 –

+1

@Kings低评价的印度用户不得评论。 – ulidtko

+0

哦,是的!你需要50名代表发表评论。 –