如何计算文件的大小(以字节为单位)?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
Run Code Online (Sandbox Code Playgroud) 所以我有这个程序分配256 MB的内存,并在用户按下ENTER后释放内存并终止.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if ( p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我多次运行这个程序并对每个程序进行后台处理,直到没有足够的内存可以分配.但是,这从未发生过.我运行了一个linux top
命令,甚至在多次运行这个程序之后,空闲内存永远不会下降到256 MB.
但是,另一方面,如果我使用calloc
而不是malloc
那时有一个巨大的差异:
p = calloc(256 * 1024 * 1024, 1);
现在,如果我运行该程序并对其进行后台处理,并重复,每次运行它时,可用内存将减少256 MB.为什么是这样?为什么不会malloc
导致可用的可用内存发生变化,但是calloc
呢?
C规范有一个有趣的脚注(#268C11dr§7.21.39)
"将文件位置指示器设置为文件结尾,如同
fseek(file, 0, SEEK_END)
,具有二进制流的未定义行为(因为可能存在尾随空字符)或具有状态相关编码但未确定以初始移位状态结束的任何流".
这是否适用于读取文件的二进制流?(从物理设备)
IMO,磁盘上的二进制文件只是一个字节的海洋.在我看来,二进制文件不能具有状态相关的编码,因为它是一个二进制文件.我对"二进制广泛的流"的概念很模糊,如果它甚至可以应用于磁盘I/O.
我看到调用fseek(file, 0, SEEK_END)
串口流就像一个com端口,或者stdin
可能无法达到真正的目的,因为结束还没有确定.从而将问题缩小到物理文件.
[编辑]答案:与老年人(可能直到20世纪80年代后期)的关注.目前在2014年,Windows,POSIT特定和非异国他人:不是问题.
@Shafik Yaghmour提供了一个很好的参考,使用fseek和ftell来确定文件的大小是否有漏洞?.@Jerry Coffin将CP/M视为二进制文件并不总是具有精确的长度.(每个维基128字节的记录).
感谢@Keith Thompson的回答.
这一点解释了规范的"(因为可能有尾随空字符)"评论.
我已经阅读过帖子,展示了如何使用fseek和ftell来确定文件的大小.
FILE *fp;
long file_size;
char *buffer;
fp = fopen("foo.bin", "r");
if (NULL == fp) {
/* Handle Error */
}
if (fseek(fp, 0 , SEEK_END) != 0) {
/* Handle Error */
}
file_size = ftell(fp);
buffer = (char*)malloc(file_size);
if (NULL == buffer){
/* handle error */
}
Run Code Online (Sandbox Code Playgroud)
我即将使用这种技术但后来遇到了描述潜在漏洞的链接.
该链接建议使用fstat.任何人都可以评论这个吗?