2010-02-12 64 views
28

如何使用std::getline函數檢查文件結束?如果我使用eof(),它將不會發出eof信號,直到我試圖讀取超出文件結尾。檢查字符串中的eof :: getline

+0

這'不建議eof'是真實的,但出於不同的原因。通過EOF讀取*完全是*當您想要測試EOF時做什麼,所以'eof'在這方面效果很好。 – 2010-02-12 12:03:41

回答

9

只要閱讀,然後檢查讀操作成功:由於多種原因

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    std::cout << "failure\n"; 
} 

由於故障可能是,你可以使用eof成員函數看到它發生的事情實際上是EOF:

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    if(std::cin.eof()) 
     std::cout << "EOF\n"; 
    else 
     std::cout << "other failure\n"; 
} 

getline返回流,因此您可以更緊湊寫:

if(!std::getline(std::cin, str)) 
39

在C++中的經典閱讀循環是:

while (getline(cin, str)) { 

} 

if (cin.bad()) { 
    // IO error 
} else if (!cin.eof()) { 
    // format error (not possible with getline but possible with operator>>) 
} else { 
    // format error (not possible with getline but possible with operator>>) 
    // or end of file (can't make the difference) 
} 
+1

這個答案太棒了。如果你需要錯誤信息,這是唯一的方法。它真的需要花時間來解決這個問題:http://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/ – 2011-07-06 11:19:09