как остановить чтение из файла в C - PullRequest
6 голосов
/ 15 января 2010

Я просто пытаюсь прочитать каждый символ файла и распечатать его, но когда файл заканчивает чтение, но я получаю кучу? после того, как он заканчивает чтение. Как мне это исправить?

#include <stdio.h>

int main(void){
    FILE *fr;            /* declare the file pointer */

    fr = fopen ("some.txt", "r");  /* open the file for reading */
        /* elapsed.dta is the name of the file */
        /* "rt" means open the file for reading text */
    char c;
    while((c = getc(fr)) != NULL)
    {
        printf("%c", c);
    }
    fclose(fr);  /* close the file prior to exiting the routine */
    /*of main*/ 


    return 0;
}

Ответы [ 7 ]

7 голосов
/ 15 января 2010

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

Итак, чтобы исправить свой код, вы должны сначала изменить объявление char c; на int c;, чтобы оно могло содержать маркер EOF при его возврате. Затем вы должны также изменить условие цикла while, чтобы проверить EOF вместо NULL.

Вы также можете вызвать feof(fr), чтобы проверить конец файла отдельно от чтения символа. Если бы вы сделали это, вы могли бы оставить c как char, но вам нужно было бы позвонить feof() после того, как вы прочитали символ, но до того, как распечатали его, и использовать break, чтобы выйти из цикла. .

2 голосов
/ 15 января 2010

В случае неудачи fgetc() возвращает EOF.

int c;
while ((c = getc(fr)) != EOF) 
{ 
    printf("%c", c); 
}
1 голос
/ 15 января 2010

getc возвращает int .

изменить char c , на int c .

также getc возвращает EOF , измените ваш тест на NULL на тест на EOF

1 голос
/ 15 января 2010

Другие уже решили проблему, с которой вы столкнулись, но вместо использования printf("%c", c);, вероятно, гораздо эффективнее использовать putchar(c);. Когда вы просите printf напечатать только один символ, возникает немало накладных расходов.

1 голос
/ 15 января 2010

Изменить это

char c;
while((c = getc(fr)) != NULL)
{
    printf("%c", c);
}

до

char c;
int charAsInt;
while((charAsInt = getc(fr)) != EOF)
{
     c = (char) charAsInt;
     printf("%c", c);
}

Другими словами: вам нужно сравнить с EOF, а не NULL. Вам также необходимо использовать переменную int, чтобы получить возвращаемое значение от fgetc. Если вы используете char, сравнение с EOF может закончиться неудачей, и вы вернетесь к тому, с чего начали.

1 голос
/ 15 января 2010

Заменить «NULL» на «EOF».

1 голос
/ 15 января 2010

fgetc() возвращает EOF в конце файла, а не NULL.

...