2013-02-15 57 views
1

Soo ...我看到一個人聲稱此代碼正在處理另一個問題。scanf(...)的有用上下文!= EOF

while(scanf("%X", &hex) != EOF) { 
    //perform a task with the hex value. 
} 

那麼,在什麼情況下EOF標誌被拋出?我雖然會繼續無限期地詢問一個數字。我添加了另一行代碼來測試它,它也正是我所期望的......

這不是一個文件,這似乎是標準輸入。那麼...... WHEN這段代碼有用嗎?
即,在什麼情況下EOF返回拋出?

+1

我想如果你按ctrl-D你可能會得到EOF ... – Floris 2013-02-15 04:22:52

+1

請參閱[此更早的問題](http://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar -eof-loop) – Floris 2013-02-15 04:23:44

+0

'EOF'不是一個拋出的標誌。它是一個擴展爲'int'類型的常量表達式的宏,通常是'(-1)'。當scanf被標準定義時,它返回'EOF'的值。 – 2013-02-15 05:57:49

回答

1

如果您查看scanf的文檔,您會看到如果在分配第一個值之前發生讀取失敗,則返回值EOF。 (文件的結尾)

http://en.cppreference.com/w/cpp/io/c/fscanf

您同樣可以測試:

while(scanf("%X", &hex) == 1) 

這是我的偏好。我期待一個輸入,所以我會明確的。

+0

什麼先生...可能會導致這樣的讀取失敗? – user1833028 2013-02-15 04:26:37

+0

如果輸入流關閉('EOF'),則會發生特定故障。如果輸入無效(* ie *不是十六進制字符),它將返回'0'。 – paddy 2013-02-15 04:34:44

+0

這意味着如果你在不是'EOF'的情況下循環,並且你收到錯誤的輸入,就像它現在的狀態一樣,你不會意識到它,並且你將會無限循環。考慮將函數調用的結果存儲在一個變量中,或者使用我更明確的循環條件。 – paddy 2013-02-15 04:37:41

0

現實地說,這個輸入在Linux上是很好的,因爲^ d會結束流,因此拋出'錯誤'。

在windows上,這種行爲是不同的......不管它是不是ctrl + d。至少我現在知道,因爲我使用了兩者。

謝謝!

+1

在DOS(和早期的Windows上,沒有在_long_時間中檢查過)用ctrl-Z發信號通知文件結束。 – vonbrand 2013-02-15 04:44:34

0

EOF在I/O錯誤和文件結束時返回。由於stdin,I/O錯誤是一種罕見事件,通過鍵盤輸入,文件結尾指示通常會採用特殊的按鍵順序。

重定向輸入發生實際使用。

假設一個程序中存在讀取十六進制文字和打印出小數文本:與命令

hex2dec < hex.txt 
2748 
291 

發生

// hex2dec.c 
#include <stdio.h>  
int main(void) { 
    unsigned hex; 
    int cnt; 
    while((cnt = scanf("%X", &hex)) == 1) { 
    printf("%u\n", hex); 
    } 
    // At this point, `cnt` should be 0 or EOF 
    if (cnt != EOF) { 
    puts("Invalid hexadecimal sequence found."); 
    return 1; 
    } 
    return 0; 
} 

// hex.txt contents: 
abc 
123 

轉換通過在stdin檢測EOF,程序知道何時返回。