Почему 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 назад, чтобы получить тот символ, который вы ожидаете получить. В противном случае вы будете получать один и тот же символ все время.

Другие вопросы по тегам