2008-11-03 60 views
25

我有一個使用getline()讀取文件中每一行的循環。std :: getline()返回

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

我注意到,調用函數getline()這樣也似乎工作:

while (getline(is, line)) 

這是怎麼回事? getline()返回一個流引用。它以某種方式被轉換爲指針嗎?這實際上是一種好的做法,還是應該堅持第一種形式?

回答

26

getline()返回的istream隱式調用其操作符void *()方法,該方法返回流是否已經遇到錯誤。因此它比eof()的調用進行更多的檢查。

+0

查爾斯是對的​​,你也對哨兵提供的操作員感到困惑。 – 2008-11-03 17:42:34

8

更新時間:

我曾誤指着basic_istream documentation有關basic_istream ::哨兵類運營商布爾()方法,但由於已經指出,這不是真正發生了什麼。我已經投票支持查爾斯和呂克的正確答案。它實際上是運算符void *()被調用。更多關於這個in the C++ FAQ

+0

您正在混淆basic_ios :: operator void * manuals/default.aspx?manual = compleat&page = ios.html#basic_ios :: operator%20void%20 * – 2008-11-03 17:41:48

+0

好點。我也糾正了。 – tgamblin 2008-11-03 22:32:54

+1

你的鏈接已經死了 – qdii 2013-07-03 10:20:57

-3

我會堅持第一種形式。雖然第二種形式可能有效,但它並不明確。您的原始代碼清楚地描述了正在進行的操作以及預期的操作方式。

5

Charles確實給了correct answer

什麼叫確實是std::basic_ios::operator void*(),而不是sentry::operator bool(),這是洽與事實std::getline()返回std::basic_istream(因此,std::basic_ios),而不是一個哨兵。

對於非信徒,見:在cppreference網站

否則,正如其他人已經說過,更喜歡第二種形式whic h是規範的。如果真的需要詳細代碼,請不要使用fail() - 我永遠不會記得是否可以使用xxx.good()而不是!xxx.fail()