在C中,我们可以使用fseek()函数找到文件的大小.喜欢,
if (fseek(fp, 0L, SEEK_END) != 0)
{
// Handle repositioning error
}
Run Code Online (Sandbox Code Playgroud)
所以,我有一个问题,是否建议使用fseek()和计算文件大小的方法ftell()?
如果您使用的是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,此方法不涉及打开文件或通过它进行搜索.它只读取文件元数据.
该fseek()/ftell()作品有时.
if (fseek(fp, 0L, SEEK_END) != 0)
printf("Size: %ld\n", ftell(fp));
}
Run Code Online (Sandbox Code Playgroud)
问题.
如果文件大小超过约LONG_MAX,则long int ftell(FILE *stream)响应有问题.
如果文件在文本模式下打开,则返回值ftell()可能与文件长度不对应."对于文本流,其文件位置指示符包含未指定的信息,"C11dr§7.21.9.42
如果文件以二进制模式打开,fseek(fp, 0L, SEEK_END)则定义不明确."将文件位置指示器设置为文件结尾,如同fseek(file, 0, SEEK_END),具有二进制流的未定义行为(因为可能存在尾随空字符)或具有状态相关编码但未确定以初始移位状态结束的任何流".C11dr脚注268. @Evert这通常适用于早于今天的平台,但它仍然是规范的一部分.
如果该文件就像是一个串行输入流或stdin,fseek(file, 0, SEEK_END)没有什么意义.
查找文件大小的常用解决方案是非便携式平台特定的解决方案.示例好的答案@dbush.
注意:如果代码尝试根据文件大小分配内存,则文件大小很容易超出可用内存.
由于这些问题,我不推荐这种方法.
通常,应该重新解决问题,不需要查找文件大小,而是在处理更多输入时增加数据.
LL免责声明:请注意,C规范脚注是提供信息的,因此不一定是规范性的.