как искать до конца файла, чтобы определить размер файла?

#c #filesize #seek

#c #размер файла #искать

Вопрос:

Я пытаюсь получить размер файла в программировании на c с помощью seek. Я не могу использовать fseek , stat.size ни ftell , есть пользовательская операционная система UNIX, в которой мне нужно запустить.

Как я могу узнать размер файла, просто используя поиск? Возможно ли это?

   FILE *fd = open(argv[1], "r");

  if(fd == NULL)
  {
    printf("Not able to open the file : %sn", argv[1]);
    return;
  }

  // Set the pointer to the end
  seek(fd, 0, SEEK_END);
  

Комментарии:

1. Почему вы не можете использовать fseek, stat.size или ftell? Можете ли вы использовать getch()? Это единственный способ, который я мог придумать.

2. И что это seek за функция, о которой вы говорите?

3. В моем классе операционных систем есть операционная система, созданная на заказ. Он имеет только специальные функции открытия, чтения, записи. Нет fopen, ftell присутствует. Так что это своего рода проблема.

Ответ №1:

seek ? Вы имеете lseek в виду, вероятно. Взгляните на страницу руководства. Что lseek возвращает?

Ответ №2:

Если вам просто интересно, будет ли конструкция, использующая offset = 0 with whence = SEEK_END , помещать смещение файла в конец файла, тогда «да», вы правы, по крайней мере, для «стандартных f/lseek() «, с которыми я столкнулся.

lseek() должен напрямую возвращать смещение файла. Для fseek() следующего ftell() вы получите смещение файла.

Ответ №3:

Обычно open() возвращает значение int, а не a FILE * . Вы должны проверить возвращаемое значение> = 0. fopen() from <stdio.h> возвращает a FILE * . Также, для записи, fopen() и fseek() являются частью стандартной библиотеки C. UNIX open() является частью POSIX. Итак, в целом, fopen() / fseek() является более переносимым.

Если вы действительно находитесь в пользовательской «Unix-подобной» среде, где это уже не так (т. Е. У вас есть пользовательский API вместо unistd.h ), тогда вы не получите хорошего ответа здесь, не предоставив дополнительной информации. Можете ли вы сказать нам, какую ОС вы используете на самом деле?

Или, как предложил Лютер, проверьте возвращаемое значение lseek() , если вы используете обычный <unistd.h> .