2012-05-04 67 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名代表發表評論。 –