Почему fseek следует вызывать со смещением -2 вместо смещения -1 в программе, которая печатает текстовый файл в обратном направлении?
Следующая программа на C печатает текстовый файл в обратном направлении:
#include <stdio.h>
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
int main(int argc, char **argv)
{
FILE *fp = f
open(argv[1], "r");
fseek(fp, -1L, SEEK_END);
while (ftell(fp))
{
putchar(fgetc(fp));
fseek(fp, -2L, SEEK_CUR);
}
putchar(fgetc(fp));
Поскольку программа должна печатать текстовый файл в обратном направлении, она должна читать каждый символ с конца, не пропуская никаких символов. Если так, то я думал, что вызов внутри цикла while должен быть
fseek(fp, -1L, SEEK_CUR);
Почему смещение составляет -2, а не -1?
Заранее спасибо!
1 ответ
Решение
Когда вы вызываете fgetc, смещение на 1 символ опережает то, что вы ожидаете, поэтому вам нужно переместить 2 назад, чтобы получить тот символ, который вы ожидаете получить. В противном случае вы будете получать один и тот же символ все время.