我有这个惯用的片段来获取二进制文件的长度:
fseek(my_file, 0, SEEK_END);
const size_t file_size = ftell(my_file);
…我知道,对于二进制流[ 1 ],迂腐fseek(file, 0, SEEK_END)
的行为是未定义的——但坦率地说,在我也没有这个问题的平台上,无论如何这是另一个问题的主题…</p>
fstat()
我的问题是:fseek()
在这种情况下我应该检查返回值吗?
if (fseek(my_file, 0, SEEK_END)) {
return 1;
}
const size_t file_size = ftell(my_file);
我从来没有见过fseek()
在这样的情况下被检查过,我也想知道fseek()
这里可能会返回什么样的错误。
编辑:
在阅读了Clifford 的回答后,我也认为在计算文件大小时处理fseek()
和返回值的最佳方法是编写一个专用函数。ftell()
但是 Clifford 的好建议不能处理size_t
数据类型(毕竟我们需要一个大小!),所以我想最后最实用的方法是使用指针来存储文件的大小,并保留返回我们的专用功能的价值仅适用于失败。这是我对 Clifford 安全尺寸计算器解决方案的贡献:
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;
}