2012-07-01 37 views
1

以下原因會導致錯誤,因爲file.eof()顯然不會返回true,直到讀取超過文件末尾。我應該怎麼做?當你讀到文件的末尾我應該使用什麼條件來停止文件讀取循環?

std::ifstream file("something.stuff", std::ios::in|std::ios::binary); 

while(!file.eof()) 
{ 
    double x, y, z; 
    file.read(reinterpret_cast<char*>(&x), sizeof(x)); // Do I need to check if(file) after every read? 
    file.read(reinterpret_cast<char*>(&y), sizeof(y)); 
    file.read(reinterpret_cast<char*>(&z), sizeof(z)); 

    // Do something with xyz 
} 

回答

8

你可以只檢查它畢竟讀取,除非你打算做部分數據的東西,所以:

while(true) 
{ 
    double x, y, z; 
    file.read(reinterpret_cast<char*>(&x), sizeof(x)); 
    file.read(reinterpret_cast<char*>(&y), sizeof(y)); 
    file.read(reinterpret_cast<char*>(&z), sizeof(z)); 

    if (!file) 
     break; 

    // Do something with xyz 
} 
+0

這是乾淨多了,感謝 – David

+0

只是爲了確認之前,每一個成功的,它不會造成任何傷害,保持閱讀'(!文件)'返回true,右後? – David

+0

@Dave:這是正確的。無害。 'read()'將檢查流是否處於良好狀態(不是eof,fail或bad),如果不是,那麼它會設置'failbit'。所以最糟糕的事情將會發生的是它會做到比必要的多兩倍。 –

1

std::ifstream::read應該設置eof標誌。

所以,是的,你應該在每次致電file.read()後檢查file.eof()

0

或者,使用seek和tell查找預先確定的文件長度,然後計算您應該執行多少次迭代。這樣,您不必在每次讀取後都檢查一下eof位。

0

是的,流的末尾,可每次讀期間達成的,所以你應該檢查如果繼續

std::ifstream file("something.stuff", std::ios::in|std::ios::binary); 

while(!file.eof()) 
{ 
    double x, y, z; 
    if (!file.read(reinterpret_cast<char*>(&x), sizeof(x)) || 
     !file.read(reinterpret_cast<char*>(&y), sizeof(y)) || 
     !file.read(reinterpret_cast<char*>(&z), sizeof(z))) 
    { 
     // failure... perhaps check file.eof() and/or file.fail() for precise condition 
     break; 
    } 
    else 
    { 
     // Do something with xyz 
    } 
} 
+0

如果您在最後一個被標記爲eof之後調用另一個讀取操作,這有什麼關係嗎?是否有任何傷害(除了額外的電話)? – David

+0

沒有傷害。 :) –

相關問題