2012-04-07 2 views
-1

я скомпилированный это (GCC компилятор):обработки в C Файл: не может понять выход

#include< stdio.h> 

main() { 

    unsigned char ch; 
    FILE *fp; 
    fp=fopen("trial","r"); 
    while((ch=getc(fp))!=EOF) 
     printf("%c",ch); 
    fclose(fp); 
} 

Это дает follwing:

Warning: comparison is always true due to limited range of the data type 

Исполняя, бесконечный поток символов напечатан на терминале. (при условии, что я создал файл с именем «пробный» до компиляции программы и написал текст в файле.)

Просьба объяснить предупреждение .....

ответ

0

Значение EOF в C является int в то время как ch здесь является char. Тип char меньше int и, следовательно, может представлять меньше значений, чем int. EOF - одно из значений, которое char просто никогда не может представлять и, следовательно, ch никогда не будет равно EOF.

В этом случае getc фактически возвращает int, чтобы он мог представлять EOF. Но вы немедленно сокращаете его до char и теряете эту дополнительную информацию.

Вот способ правильно написать это.

int cur; 
FILE *fp; 
fp=fopen("trial","r"); 
while((cur = getc(fp))!=EOF) { 
    unsigned char ch = cur; 
    printf("%c",ch); 
} 
fclose(fp); 
+0

Если я беру нормальный символ (в отличие от unsigned char), он может представлять значения от -128 до +127, а EOF - численно -1.Возможно ли, чтобы подписанный символ соответствовал EOF? – Abhay

+1

@Abhay, no. Проблема сложнее. EOF представляет собой целое число -1, которое представлено иначе, чем char -1. Это сделано специально, чтобы вы не могли путать значение символа с индикатором конца файла. – Neil

0

getc() возвращает int. Вы усекаете (и меняете подпись) на unsigned char с этим назначением, поэтому он никогда не будет соответствовать EOF. Просто измените тип ch на int, и со мной все будет в порядке.

+0

Не могли бы вы объяснить, что такое символ EOF в C и каково его целочисленное значение? – Abhay

+0

Вы можете просто распечатать его, если хотите ... –

1

Поскольку EOF равно -1, а ваш ch - это символ без знака, который означает, что ch никогда не станет равным -1.

Вместо этого используйте int ch;

+0

Строго говоря, это неправда. Беззнаковый символ никогда не может быть отрицательным, но если вы протестировали unsigned char с номером 255 с символом -1, вы обнаружите, что это одно и то же (хотя компилятор обязательно даст вам полное предупреждение). – Neil

+0

Если я беру нормальный символ (в отличие от unsigned char), он может представлять значения от -128 до +127, а EOF - численно -1. Возможно ли, чтобы подписанный символ соответствовал EOF? – Abhay

+0

@Abhay, EOF находится в stdio.h как #define EOF -1 Поэтому прямо сравнивать его с целым числом. –

0

getc возвращает целое число, не зря. Индикатор EOF находится вне диапазона нормального символа, поскольку в противном случае вы могли бы путать законный символ с индикатором EOF. Тем не менее, вы назначаете результаты символу, который ограничивает ответ, чтобы попасть в пределы значения char. Короче говоря, вы никогда не узнаете, когда конец файла был достигнут таким образом. Сделайте «ch» a int или назначьте результат от звонка до getc до unsigned char типа после вы сравниваете его с EOF.

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