Trick 1.6 - eof
在 C 語言中,EOF 的值是 -1
。通常用 getchar()
或者是 scanf()
如果回傳的是 EOF 就代表讀到檔尾啦。如果我們用的是 gets()
那麼讀取失敗會得到 NULL。
那麼在 C++ 怎麼辦呢?cin
針對 eof 與讀取失敗有分開處理,也就是說,我們可以針對這個 <istream>
裡頭的 cin
,呼叫 cin.eof()
或 cin.fail()
函式來得到現在的狀態。
所以「讀到檔尾結束」的 <cstdio>
版本是:
int n;
while (scanf("%d", &n)!=EOF) {
solve();
}
而 <iostream>
的版本則是:
int n;
while ((cin >> n) && !cin.eof()) {
solve();
}
如果我們不關心 eof,只關心是否讀取失敗,那麼 <iostream>
的物件可以很貼心地幫我們轉換成 bool
:
int n;
while (cin >> n) { // (bool)(cin >> n) 讀完後等價於 !cin.fail()
solve();
}