2013-04-25 2 views
4

Я искал сеть о том, как использовать возвращаемое значение scanf для проверки конца файла! Я нашел следующий код. Но я с трудом понимаю?Использование возвращаемого значения «scanf()» для проверки конца файла

Как работает этот метод?

Что означает оператор «~»?

while(~scanf("%d",&n)) { 
    /* Your solution */ 
} 
+0

Не следует использовать 'fscanf()' вместо этого для чтения из файлов? 'Scanf()' считывает данные исключительно из 'stdin' eh? –

ответ

9

Это ужасный способ, чтобы проверить, является ли значение отличается от -1. ~x возвращает побитовое отрицание x. Поэтому, имея в виду бесплатный код, используемый для отрицательных чисел (на большинство компиляторов, кстати, так что этот подход даже не очень переносимый) -1 представлен последовательностью 1-й и, следовательно, ~(-1) произведет нуль.

Пожалуйста, не используйте этот подход. Просто напишите scanf("%d", &n) != EOF Путь легче понять.

+2

Да, и переносные способы - это 'scanf ("% d ", & n)! = EOF', [-1 - значение EOF на большинстве платформ] (http://www.cplusplus.com/reference/cstdio/EOF/) –

+1

@GrijeshChauhan спасибо! Это абсолютно верно. Изменит мой ответ. –

+0

@IvayloStrandjev Не 'fscanf()' должен быть правильным выбором для чтения из файлов по сравнению с 'scanf()'? Можем ли мы читать что-либо, кроме 'stdin', используя' scanf() '? –

2

~ является побитовым оператором NOT. Следовательно, это немного запутанный способ петлирования, пока scanf не возвращает значение, отличное от -1. Другими словами,

while(~scanf("%d",&n)) 

эквивалентно

while(scanf("%d",&n) != -1) 
0

В C ~ - оператор, выполняющий бит-мутную операцию сдвига, создает дополнение к исходному номеру. А в С нет булева типа, 0 ложна все остальное, правда, в вашем примере:

while(~scanf("%d",&n)) { 
    /* Your solution */ 
} 

Scanf() возвращает EOF, если нет больше нет символов для чтения, которое равно -1 (не на всех платформах!), поэтому -1 представлен (111 ... 32 раза в 32-битной архитектуре) ~ EOF = 0, поэтому существует риск того, что код не будет работать для всех платформ.

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