2013-02-15 3 views
1

Су ... Я видел, как парень утверждал, что этот код работал над другим вопросом.Полезный контекст scanf (...)! = EOF

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

Итак, в каком контексте выброшен флаг EOF? Я, хотя он просто будет просить номер на неопределенный срок. Я добавил еще одну строку кода, чтобы проверить ее, и она делает именно то, что я ожидал от нее.

Это не файл, это похоже на stdin. Итак ... КОГДА этот код полезен?
Т.е., в каком контексте возвращен возврат EOF?

+1

Я думаю, что если вы нажмете ctrl-D, вы можете получить EOF ... – Floris

+1

См. [Этот более ранний вопрос] (http://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar -eof-loop) – Floris

+0

'EOF' - это не флаг, который был брошен. Это макрос, который расширяется до постоянного выражения типа 'int', обычно' (-1) '. 'scanf' возвращает значение' EOF', если это определено стандартом. –

ответ

1

Если вы посмотрите на документацию для scanf, вы увидите, что значение EOF возвращается, если сбой чтения произошел до того, как было присвоено первое значение. (т.е. конец файла)

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

Вы также могли тест:

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

Это мое предпочтение. Я ожидаю один вход, поэтому я буду явным.

+0

И какой сэр ... может вызвать такой провал чтения? – user1833028

+0

Этот конкретный сбой произойдет, если входной поток будет закрыт ('EOF'). Если вход просто недействителен (* т.е. * не шестнадцатеричный символ), он вместо этого вернет '0'. – paddy

+0

Это означает, что если вы выполняете цикл, а не 'EOF', и получаете плохой ввод, так как он в настоящее время стоит, вы не поймете этого, и вы будете продолжать цикл бесконечно. Рассмотрите возможность хранения результата вызова функции в переменной или с использованием более явного условия цикла. – paddy

0

Реально говоря, этот вход хорош для Linux, потому что^d закончит поток, тем самым выбросив «ошибку».

В окнах это поведение отличается ... что бы это ни было, это не ctrl + d. По крайней мере, я знаю сейчас, потому что я использую оба.

Спасибо!

+1

В DOS (и ранних версиях Windows, не проверенных в _long_ времени) конец файла был сигнализирован ctrl-Z. – vonbrand

0

EOF возвращается при ошибке ввода-вывода и в конце файла. С stdin ошибка ввода-вывода является редким событием и с клавиатурным вводом индикация конца файла обычно принимает специальную последовательность клавиш.

Практическое применение происходит с перенаправленным вводом.

Предположим, что программа существует, которая читает шестнадцатеричный текст и выводит десятичную текст:

// 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 

Преобразование происходит с помощью команды

hex2dec < hex.txt 
2748 
291 

Определяя EOF на stdin, программа знает, когда вернется ,

Смежные вопросы