У меня есть этот идиоматический фрагмент для получения длины двоичного файла:
fseek(my_file, 0, SEEK_END);
const size_t file_size = ftell(my_file);
... Я знаю, что педантичный fseek(file, 0, SEEK_END)
имеет неопределенное поведение для двоичного потока [ 1 ] - но, честно говоря, на платформах, где это проблема, у меня тоже нет fstat()
, и в любом случае это тема для другого вопроса ...
Мой вопрос: должен ли япроверить возвращаемое значение fseek()
в этом случае?
if (fseek(my_file, 0, SEEK_END)) {
return 1;
}
const size_t file_size = ftell(my_file);
Я никогда не видел, чтобы fseek()
был проверен в таком случае, и я также задаюсь вопросом, какая ошибка fseek()
могла бы когда-либо случитьсявернуться сюда.
РЕДАКТИРОВАТЬ:
После прочтения ответ Клиффорда , я также думаю, что лучший способ справиться с fseek()
и ftell()
Возврат значений при расчете размера файла заключается в написании выделенной функции. Однако хорошее предложение Клиффорда не может иметь дело с типом данных size_t
(нам нужен размер в конце концов!), Поэтому я предполагаю, что наиболее практичным подходом в конце будет использование указателя для храненияразмер файла, и сохраните возвращаемое значение нашей выделенной функции только для сбоев. Вот мой вклад в решение Клиффорда для калькулятора безопасного размера:
int fsize (FILE * const file, size_t * const size) {
long int ftell_retval;
if (fseek(file, 0, SEEK_END) || (ftell_retval = ftell(file)) < 0) {
/* Error */
*size = 0;
return 1;
}
*size = (size_t) ftell_retval;
return 0;
}
Так что, когда нам нужно узнать длину файла, мы можем просто сделать:
size_t file_size;
if (fsize(my_file, &file_size)) {
fprintf(stderr, "Error calculating the length of the file\n");
return 1;
}