Чтение последних 50 символов файла с помощью fseek () - PullRequest
0 голосов
/ 15 февраля 2010

Я пытаюсь прочитать последние 50 символов в файле, выполнив следующее:

FILE* fptIn;
char sLine[51];
if ((fptIn = fopen("input.txt", "rb")) == NULL) {
    printf("Coudln't access input.txt.\n");
    exit(0);
}
if (fseek(fptIn, 50, SEEK_END) != 0) {
    perror("Failed");
    fclose(fptIn);
    exit(0);
}
fgets(sLine, 50, fptIn);
printf("%s", sLine);

Это не возвращает ничего, что имеет смысл удаленно. Почему?

Ответы [ 4 ]

11 голосов
/ 15 февраля 2010

Измените 50 на -50. Также обратите внимание, что это будет работать только с кодировками символов фиксированной длины, такими как ASCII. Поиск 50-го символа с конца далеко не тривиален для таких вещей, как UTF-8.

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

Помимо знака смещения, следующие вещи могут создавать проблемы:

Символ новой строки заставляет fgets перестать читать, но он считается допустимым символом и поэтому включен в строку, скопированную в строку

Используйте ferror или feof, чтобы проверить, произошла ли ошибка или был достигнут конец файла.

См. Также

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

Попробуйте установить смещение на -50.

0 голосов
/ 15 февраля 2010

fseek (fptIn, 50, SEEK_END)

Устанавливает указатель потока в конце файла, а затем пытается установить курсор на 50 байтов впереди него. Помните, для двоичных потоков:

3 Для двоичного потока новая позиция, измеряемая в символах от начала файла, получается путем добавления смещения к позиции, указанной с помощью wherece..The позиция - начало файла, если откуда SEEK_SET, текущее значение файла индикатор положения, если SEEK_CUR, или конец файла, если SEEK_END. Бинарный поток не должен Значительно поддерживает вызовы fseek со значением откуда SEEK_END.

Этот вызов не может быть выполнен. Следующий вызов fgets вызывает UB. Попробуйте смещение -50, а также, если вызов успешен, попробуйте прочитать его в буфер

Примечание: упор мой

...