当我运行程序并选择查看产品列表时,它不会打印任何内容。过了一段时间,我发现fl_size
的值总是为0.这是为什么?
void view_prdct_code_list() {
FILE *stock = fopen("stock.dat","r+");
assert(stock);
int fl_size=ftell(stock);
int prd_size= sizeof(product);
int quantity= fl_size/prd_size;
printf("fl_size=%d",fl_size);
fseek(stock,0,SEEK_SET);
prdct cprd= (product *)malloc (sizeof(product)*quantity);
assert(cprd);
int i;
fread(cprd,prd_size,quantity,stock);
for (i=0;i<quantity;i++){
printf("PRODUCT CODE: %d\n",cprd->code);
}
free(cprd);
fclose(stock);
}
答案 0 :(得分:6)
ftell
不会返回文件的总大小;它返回文件中的当前读取或写入位置。打开文件后立即调用ftell
,这样该位置就是文件的开头。您可以在调用fseek(stock, 0, SEEK_END)
之前使用ftell
寻找结尾,或者您可以下拉图层并使用fstat(fileno(stock))
直接从操作系统中检索文件大小。
补充说明:
fread
无法保证即使您要求也可以一口气读取整个文件。ftell
会返回long
,而非int
。"r+b"
打开这个明显为二进制的文件。malloc
的返回值。 (有必要在C ++中执行此操作,但在C中不仅没有必要,它可以隐藏错误。)答案 1 :(得分:2)
检查ftell
的手册页,例如:http://linux.die.net/man/3/ftell
以下是相关部分:&#34; ftell()函数获取流指向的流的文件位置指示符的当前值。&#34;
打开文件时,光标位置将在开头。所以从开始的距离将为零。因此ftell
返回零。
要查找文件大小,请参阅以下链接:How can I get a file's size in C?。这是一个简短的片段:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
请务必在上面调用fseek(fp, 0L, SEEK_SET);
。
答案 2 :(得分:0)
因为ftell
返回文件开头到当前位置的大小。
fseek(stock,0,SEEK_SET);
表示您将位置设置为文件的第一个位置。
此外,您必须在<{strong> fl_size=ftell(stock);
之后设置fseek
。