Переместить указатель файла назад после fseek - PullRequest
0 голосов
/ 21 апреля 2019

Я знаю, что этот вопрос звучит глупо, но я не могу понять, когда я изменяю свой указатель файла. Я только начал изучать, как работают файлы в C. Я выполнял простое упражнение, в котором мне нужно было написать функцию, которая показывает размер файла и принимает указатель файла в качестве параметра. Это моя функция:

int file_size_from_file(FILE *f)
{
    int size;
    if(f==NULL)
    {
        return -2;
    }
    fseek (f, 0, SEEK_END);
    size = ftell(f);
    return size;
}

Но система показывает, что я не могу изменить указатель файла. Я думал, что все, что мне нужно было сделать, это написать fseek(f,0,SEEK_SET); после size..., чтобы вернуть курсор в исходное положение, но это не сработало.

Вот как работает система проверки:

FILE *f = fopen("bright", "r");

int pos = 7220;

fseek(f, pos, SEEK_SET);

printf("#####START#####");
int res = file_size_from_file(f);
printf("#####END#####\n");

test_error(res == 7220, "Funkcja file_size_from_file zwróciła nieprawidłową wartość, powinna zwrócić %d, a zwróciła %d", 7220, res);
test_error(ftell(f) == pos, "Function should not modify file pointer");

fclose(f);

После проверки появляется сообщение «FAIL - функция не должна изменять указатель файла»

1 Ответ

2 голосов
/ 21 апреля 2019

Ваша функция должна вернуть файл в положение, в котором он был при вызове:

long int file_size_from_file(FILE *f)
  {
  long int size;
  long int pos;

  if(f==NULL)
    return -2;

  pos = ftell(f);

  fseek (f, 0, SEEK_END);
  size = ftell(f);
  fseek (f, pos, SEEK_SET);

  return size;
  }

Удачи.

...