\377 символ в c

я пытаюсь прочитать файл в c. у меня есть файл .txt, и он имеет такое содержимое:

файл_один.txt файл_два.txt файл_три.txt файл_четыре.txt

когда я пытаюсь прочитать этот файл с помощью fopen, я получаю этот вывод:

файл_один.txt файл_два.txt файл_три.txt файл_четыре.txt\377

что означает \377? Вот мой код.

    #include <stdio.h>

    #include <stdlib.h>

    int main(int argc, const char * argv[]){

        FILE *filelist;

        char ch;

        filelist=fopen("file-path", "rt");

        while (!feof(filelist)) {
            ch = getc(filelist);
            printf("%c",ch);
        }

        fclose(filelist);

        return 0;
    }

person saidozcan    schedule 11.12.2012    source источник


Ответы (2)


Функция getc() возвращает результат типа int, а не типа char. Ваш char ch; должен быть int ch;.

Почему он возвращает int? Поскольку возвращаемое значение является либо только что прочитанным символом (как unsigned char, преобразованным в int), или специальным значением EOF (обычно -1), указывающим либо на ошибку ввода или условие конца файла.

Не используйте функцию feof() для определения конца ввода. Он возвращает true только после того, как у вас закончатся входные данные. Ваш последний вызов getc() возвращает EOF, который при сохранении в объекте char преобразуется в (char)-1, что обычно равно '\377'.

Другая проблема заключается в том, что feof() никогда не вернет истинное значение, если произошла ошибка ввода; в этом случае ferror() вернет true. Используйте feof() и/или ferror() после того, как getc() вернет EOF, чтобы сообщить, почему он вернул EOF.

Чтобы прочитать из файла, пока не дойдете до его конца:

int ch;
while ((ch = getc(filelist)) != EOF) {
    /* ch contains the last character read; do what you like with it */
}

Рекомендуемая литература: раздел 12 часто задаваемых вопросов о comp.lang.c.

person Keith Thompson    schedule 11.12.2012
comment
while ((ch = getc(filelist)) != EOF) printf(%c,ch); я запускаю этот код, и он сработал. Но ch var - это int, как получилось, что вывод будет строкой? - person saidozcan; 12.12.2012
comment
содержит ли переменная ch значение ascii char на каждом этапе чтения? - person saidozcan; 12.12.2012
comment
@ user1772101: Да (при условии, что система использует ASCII). - person Keith Thompson; 12.12.2012

\377 — это восьмеричная управляющая последовательность, десятичная 255, все биты установлены. Это происходит от преобразования EOF, которое обычно имеет значение -1, в char из-за

while (!feof(filelist)) {

feof(filelist) становится истинным только после того, как вы попытались прочитать файл дальше.

Таким образом, в конце файла вы снова входите в цикл, и getc() возвращает EOF.

person Daniel Fischer    schedule 11.12.2012