是否建议使用fseek()计算文件大小的方法?

msc*_*msc 4 c file

在C中,我们可以使用fseek()函数找到文件的大小.喜欢,

if (fseek(fp, 0L, SEEK_END) != 0)
{
    //  Handle repositioning error
}
Run Code Online (Sandbox Code Playgroud)

所以,我有一个问题,是否建议使用fseek()和计算文件大小的方法ftell()

dbu*_*ush 7

如果您使用的是Linux或其他类似UNIX的系统,那么您需要的是stat功能:

struct stat statbuf;
int rval;

rval = stat(path_to_file, &statbuf);
if (rval == -1) {
    perror("stat failed");
} else {
    printf("file size = %lld\n", (long long)statbuf.st_size;
}
Run Code Online (Sandbox Code Playgroud)

在MSVC下的Windows上,您可以使用_stati64:

struct _stati64 statbuf;
int rval;

rval = _stati64(path_to_file, &statbuf);
if (rval == -1) {
    perror("_stati64 failed");
} else {
    printf("file size = %lld\n", (long long)statbuf.st_size;
}
Run Code Online (Sandbox Code Playgroud)

与使用不同fseek,此方法不涉及打开文件或通过它进行搜索.它只读取文件元数据.


chu*_*ica 5

fseek()/ftell()作品有时.

if (fseek(fp, 0L, SEEK_END) != 0) 
  printf("Size: %ld\n", ftell(fp));
}
Run Code Online (Sandbox Code Playgroud)

问题.

  1. 如果文件大小超过约LONG_MAX,则long int ftell(FILE *stream)响应有问题.

  2. 如果文件在文本模式下打开,则返回值ftell()可能与文件长度不对应."对于文本流,其文件位置指示符包含未指定的信息,"C11dr§7.21.9.42

  3. 如果文件以二进制模式打开,fseek(fp, 0L, SEEK_END)则定义不明确."将文件位置指示器设置为文件结尾,如同fseek(file, 0, SEEK_END),具有二进制流的未定义行为(因为可能存在尾随空字符)或具有状态相关编码但未确定以初始移位状态结束的任何流".C11dr脚注268. @Evert这通常适用于早于今天的平台,但它仍然是规范的一部分.

  4. 如果该文件就像是一个串行输入流或stdin,fseek(file, 0, SEEK_END)没有什么意义.

查找文件大小的常用解决方案是非便携式平台特定的解决方案.示例好的答案@dbush.

注意:如果代码尝试根据文件大小分配内存,则文件大小很容易超出可用内存.

由于这些问题,我不推荐这种方法.

通常,应该重新解决问题,不需要查找文件大小,而是在处理更多输入时增加数据.


LL免责声明:请注意,C规范脚注是提供信息的,因此不一定是规范性的.


GMi*_*ael 0

我认为最好的方法是fstat(): https: //linux.die.net/man/2/fstat

  • C 语言和 C 标准库都不知道“fstat”函数。 (3认同)