Fseek на C проблема - PullRequest
       1

Fseek на C проблема

1 голос
/ 23 апреля 2010

Я тестирую этот код, но он не работает, всегда говорится, что произошла ошибка: S

int main(int argc, char **argv) {
    FILE *file_pointer;
    file_pointer = fopen("text.txt","r");
    if(fseek(file_pointer, 0, -1)) {
        puts("An error occurred");
    }
    else {
        char buffer[100];
        fgets(buffer, 100, file_pointer);
        puts("The first line of the file is:");
        puts(buffer);
    }
    fclose(file_pointer);
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 23 апреля 2010

Почему вы используете -1 для третьего параметра fseek? Это должен быть любой из SEEK_SET, SEEK_CUR или SEEK_END.

Согласно вашему коду это должен быть SEEK_SET, который ищет начало файла, но использование 0, как в вашем случае, оставляет указатель только в начале файла.

2 голосов
/ 23 апреля 2010

Вы проверили, что файл открылся правильно?
т.е. если file_pointer имеет значение null?

Типичное использование C будет примерно таким:

FILE *file_pointer;
if ( !(file_pointer=fopen("text.txt","r")) ) {
    puts("Error opening file");
    puts(strerror(errno)); /* prints the system error message */
    return 1; /* returning non-zero exits the program as failed */
}

if(fseek(file_pointer, 0, -1)) {
    puts("An error occurred");
}

ps. Вы должны использовать макросы SEEK_SET, SEEK_CUR, SEEK_END в fseek вместо -1

1 голос
/ 23 апреля 2010

Вы открываете свой файл в текстовом режиме (поскольку вы не указали и явно не указали b флаг для fopen). Для файлов, открытых в текстовом режиме, функциональность fseek ограничена. Последний параметр может быть только SEEK_SET и ничего больше. Позиция, если она определяется созданным пользователем значением, должна быть 0 и ничего более.

Вы, очевидно, выполнили последнее требование, но что это делает -1, неясно.

7.19.9.2 Функция fseek
4 Для текстового потока либо смещение должно быть ноль или смещение должно быть значением возвращено ранее успешным вызовом функции ftell в потоке связаны с тем же файлом и откуда должно быть SEEK_SET .

0 голосов
/ 23 апреля 2010

fseek() возвращает 0 в случае успеха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...