2010-08-30 62 views
7

我正在運行自己的C++文本書,作爲C++編程的回顧。其中一個實踐問題(沒有詳細說明)要我定義一個可以通過ifstream或cin(例如istream)作爲參數的函數。從那裏,我必須通過流。麻煩的是,我找不到一種方法讓這個的一個函數使用cin和ifstream來有效地找到流的結尾。即,查找cin&ifstream的流結束符?

while(input_stream.peek() != EOF) 

不會爲cin工作。我可以修改函數來查找特定的短語(比如「#End of Stream#」或某物),但是如果我傳遞的文件流具有這個確切短語,我認爲這是一個壞主意。

我曾經想過使用函數重載,但是到目前爲止,本書提到了它希望我這樣做的時候。我可能在這個練習題上付出了太多的努力,但我喜歡這個創造性的過程,並且很好奇,如果有這樣一種方法可以做到這一點而不會超載。

+0

檢查這個問題:http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie 2010-08-30 18:23:12

回答

4

eof()確實爲cin工作。你做錯了什麼;請發佈您的代碼。一個常見的絆腳石是eof標誌被設置爲之後您嘗試讀取流結束後面。

下面是一個示範:

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

和其輸出:

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

+0

對不起,我最初有while(!input_stream.eof()),但後來意識到我寫了while(input_stream.peek!= EOF),而不是。無論如何,這兩種方法都可以使用control + z(具有諷刺意味的是,我只是讀了wikipedia中的eof字符)。感謝atzz幫助,以及每個人! – user435219 2010-08-30 18:37:00

+0

首選將流轉換爲'.eof'或'.bad'上的布爾值。 – 2012-05-02 17:45:23

2

爲什麼std::cin.eof()不工作? cin將在標準輸入關閉時發出EOF信號,當用戶使用Ctrl + d(* nix)或Ctrl + z(Windows)或(在管道輸入流的情況下)文件結尾

+1

在Windows中是「Ctrl + Z」,「Ctrl + D」是基於UNIX的系統。 – Archie 2010-08-30 18:25:34

+0

@Archie哦,好點;補充說,在 – 2010-08-30 18:27:56

+0

啊,這確實工作(無論如何,以及Ctrl + Z的Windows)。對不起,如果我之前在(post_stream.eof())中有一些混淆,並且將它編輯爲while(input_stream.peek()!= EOF)。無論如何,我關心的一點是while(!input_stream.eof())是當函數讀取EOF字符時,爲input_stream設置失敗位。這是否應該發生? – user435219 2010-08-30 18:30:36

3
(EOF可以用Ctrl-Z上許多其他操作系統的Windows和Ctrl-d產生的)

如果您在布爾上下文中使用流,那麼它會將自身轉換爲等於true的值(如果尚未達到EOF),並且如果嘗試讀取EOF(不是它)如果從流中讀取以前的錯誤,也是錯誤的)。

由於流上的大多數IO操作都返回流(因此它們可以鏈接)。您可以進行讀取操作並在測試中使用結果(如上所述)。

所以一個程序從流中讀取數字流:

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
}