2016-05-17 89 views
1

我有一個函數,應該通過字符讀取文件字符並輸出到控制檯,直到它到達EOF。該功能可以很好地顯示我想要的所有角色,但它只是繼續前進,並且從不停止。EOF功能故障

下面是功能

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    joke.clear(); 
    ch = joke.get(); 
    while (ch != EOF) 
    { 
     cout << ch; 
     ch = joke.get(); 
    } 
} 

文件內容如下

「(空行) 問:什麼做的舌頭說牙齒?」

正如我所說,它顯示的行很好,但循環繼續問號後。

任何想法,爲什麼這可能是?此外,是否需要更多信息來正確回答我的問題?

回答

1

這樣做的典型方式是:直到遇到EOF

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    while (true) 
    { 
     ch = joke.get(); 
     if (joke) { 
      cout << ch; 
     } else { 
      break; 
     } 
    } 
} 

表達joke將評估爲true。我不知道爲什麼你想先撥打joke.clear()

+1

這只是我從一個文件開始時就教過的習慣。只要確保一開始就沒有標誌。你認爲這是毫無意義的,或者你認爲這對程序可能有害? 編輯::至於你發佈的代碼,它肯定會進一步推進該程序,但不佔空間字符,並顯示一切沒有空間 – Podo

+0

另外,好奇,如果你有任何想法,爲什麼我的代碼*不*工作。 – Podo

+0

我不認爲你應該盲目地調用clear()''。如果有標誌設置,那麼這將是一個原因,只是清除它們將無濟於事。您的代碼不起作用,因爲C++流不像C那樣將EOF讀爲字符。 C++流讀取字符,直到它們碰到EOF。 (他們從來沒有真正返回EOF字符 - 這是一個C的東西。) – Phil

1

@Phil回答「如何在C++中做到這一點」。我的答案是「爲什麼會發生這種情況」和「如何在C中執行此操作」(它仍然以C++工作)。


由於ASCII表去一路從1,我們有串端接(說話C和C++語言)保留字節值0('\0'的EOF必須之外的特殊值的。

這就是爲什麼getchar()ifstream::get()返回int,而不是char。因此,所有你需要做的是改變

char ch; 

int ch; 

,並投它爲char印刷:

cout << (char) ch; 

技術上,EOF通常是-1。您的char可能有0 - 255,這意味着它永遠不會等於-1。一個體面的編譯器-Wall啓用應該給你至少一個警告,但。

+0

更一般地說,而不是'int'使用'std :: istream :: traits_type :: int_type'。這適用於所有字符編碼,而不僅僅是ASCII。 –