Почему ftell () показывает неправильную позицию после fread ()?

Я получаю очень странную ошибку при попытке чтения из простого текстового файла с помощью вызова c fread ().
Я сделал очень простую программу, чтобы показать эту ошибку:

int main(int argc ,char ** argv) {
  FILE* fh = fopen("adult.txt","r");
  if(fh==NULL){
    printf("error opening file\n");
    exit(0);
  }

  int s = 1000;
  printf("cur before=%d\n",ftell(fh));
  char* b = malloc (sizeof(char)*s);
  int k =fread(b,sizeof(char),s,fh);
  printf("cur after reading %d bytes =%d\n",k,ftell(fh));

  return EXIT_SUCCESS;
}

И что я получу как вывод:

cur before=0
cur after reading 1000 bytes =1007

Это нормально? fread возвращает число «1000», но курсор (с ftell ()) показывает 1007, и любая помощь будет оценена.

Ответы на вопрос(3)

ftell:

или двоичные потоки, возвращаемое значение соответствует количеству байтов от начала файла. Для текстовых потоков значение не обязательно должно быть точным числом байтов от начала файла, но возвращаемое значение может быть s до тех пор, пока не будет использовано для восстановления индикатора положения в этой позиции с помощью fseek.

Так что да, это нормально.

что символ «Конец строки» (EOL) зависит от базовой операционной системы. Например, в Windows, если вы открываете файл с помощью 'r' (или не Binary), то всякий раз, когда есть последовательность '\ r \ n', ОС будет возвращать только '\ n'. Точно так же, когда вы пишете в файл, который не открывается в двоичном режиме, тогда в Windows он будет писать '\ r \ n', когда вы просто пишете '\ n'. Для систем Unix такого перевода по ОС не делается. Классические Mac будут использовать '\ r' для символа конца строки, но я думаю, что теперь они используют '\ n' для EOL. Я надеюсь, что это очищает модное слово '\ n', которое будет представлено (возможно) несколькими символами (\ r \ n).

'\n' может быть представлен двумя символами, так что есть перекос, который вы получаете.

Если ты не хочешь, чтобы это произошло, открой финал в двоичном режиме.

ВАШ ОТВЕТ НА ВОПРОС