我试图回答这个问题:
如果您有一个声明为“FILE *f;”的文件 sizeof(f) 函数返回文件的大小。
将数据加载到文件时,我注意到大小没有更新,因此我断定它是 False。这是我使用的脚本:
int main()
{
FILE *f;
f = fopen("cagandoejemplos.dat", "wb");
for(int i = 0; i < 5; i++)
{
fwrite(&i,sizeof(int),1,f);
}
fclose(f);
int tam = sizeof(f);
cout << tam;
return 0;
}
但是,从理论来看,我找不到解释我理解为什么 size of 不会与文件一起使用的解释。如果我能看到如何“计算文件的长度”
我也没有在 Kernighan 和 Ritchie 中找到答案。什么和这里一样?
所以我的问题是:虽然我不能使用'sizeof'来知道文件的大小......这是为什么呢?
False,返回变量的大小
f
。正如@PaperBirdMaster 告诉你的那样,这种说法是错误的。
sizeof
是一个运算符,指示作为参数传递给它的类型的大小。在手头的情况下,
f
它只不过是一个指向输入/输出库内部使用的结构的指针,用于管理对文件的访问。换句话说......你没有直接访问文件,所以你不能用它sizeof
来解决问题。我不相信这些答案有几个原因:
如果文件是二进制文件
fseek(SEEK_END)
,则不安全。系统有分页和分段内存的坏习惯。这意味着占用单个位的文件在磁盘上最多占用几个 KB(取决于使用的文件系统)......这是一个块的大小。在这些情况下,二进制访问可能无法检测到文件的结尾,因为毕竟一切都是字节并且它们都可以是有效的。实际上,在文档中您可以阅读以下通知:
如果文件是文本并且不使用ASCII编码,会有字符占用超过1个字节...这种情况下,到文件末尾测量偏移量会给出不正确的结果...它会告诉你文件更长。
再次在文档中,您可以阅读以下内容:
所以我很抱歉。您选择的示例将在任何地方给您带来问题。
然后?
不幸的是,没有标准的解决方案。如果您从文件包含 ASCII 文本的假设开始,那么是的,您可以使用您提到的示例……但始终知道其局限性。
另一种选择可能是用宽字符打开文件以适应文件正在使用的编码并逐个字符地读取保持计数(这是一种缓慢的机制,但对于小文件,它可能是值得的)。
第三种可能性(如果您只想知道大概大小)是访问文件的属性: