C 为什么ftell在此函数中返回0?
当我运行程序并选择查看产品列表时,它不会打印任何内容。一段时间后,我发现C 为什么ftell在此函数中返回0?,c,ftell,C,Ftell,当我运行程序并选择查看产品列表时,它不会打印任何内容。一段时间后,我发现fl\u 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 quant
fl\u 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);
}
void视图\u prdct\u代码\u列表(){
文件*stock=fopen(“stock.dat”、“r+”);
断言(股票);
int fl_size=ftell(库存);
int prd_size=sizeof(产品);
整数数量=fl\U尺寸/prd\U尺寸;
printf(“fl_大小=%d”,fl_大小);
fseek(stock,0,SEEK_SET);
prdct cprd=(产品*)malloc(产品大小)*数量);
断言(cprd);
int i;
fread(cprd、珠三角规模、数量、库存);
对于(i=0;icode);
}
免费(cprd);
fclose(股票);
}
因为ftell
返回文件从开始到当前位置的大小
fseek(stock,0,SEEK_SET);
表示您将位置设置为文件的第一个咬合位置
fseek(stock,0,SEEK_SET);
此外,还必须设置
fl_size=ftell(库存)因为ftell
返回文件从开始到当前位置的大小,所以在fseek
之后
fseek(stock,0,SEEK_SET);
表示您将位置设置为文件的第一个咬合位置
fseek(stock,0,SEEK_SET);
此外,还必须设置fl_size=ftell(库存)代码>在fseek
之后检查ftell
的手册页,例如:
下面是相关部分:“ftell()函数获取流所指向的流的文件位置指示符的当前值。”
打开文件时,光标位置将在开始处。所以从起点到终点的距离为零。因此ftell
返回零
要查找文件大小,请参阅以下链接:。简而言之,这里有一个片段:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
确保调用fseek(fp,0L,SEEK\u SET)代码>在上面之后。检查手册页中的ftell
,例如:
下面是相关部分:“ftell()函数获取流所指向的流的文件位置指示符的当前值。”
打开文件时,光标位置将在开始处。所以从起点到终点的距离为零。因此ftell
返回零
要查找文件大小,请参阅以下链接:。简而言之,这里有一个片段:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
确保调用fseek(fp,0L,SEEK\u SET)
在上面之后。ftell
不返回文件的总大小;它返回文件中当前的读或写位置。打开文件后立即调用ftell
,因此该位置是文件的最开始位置。您可以使用fseek(stock,0,SEEK_END)
在调用ftell
之前搜索到底,或者您可以下拉一个层并使用fstat(fileno(stock))
直接从操作系统检索文件大小
进一步说明:
如果您正在从管道读取数据,则这两个选项都不起作用。(通常,您需要检查每个文件访问操作是否成功。)
fread
即使您要求,也不能保证一口就能读取整个文件
正如'alk'指出的,ftell
返回的是long
,而不是int
如果long
仅为32位,则文件可能太大,以至于其大小不适合long
。如果您的程序需要处理这么大的文件,您需要在每个.c
文件的顶部(在所有包含之前)定义文件偏移量64位,并使用fseeko
和ftello
。(或任何与Windows等效的软件。)
您应该使用模式“r+b”
打开这个明显的二进制文件
没有文件头的二进制文件(特别是没有,偏移量为零时至少有四个字节)是一件坏事
不要强制转换malloc
的返回值。(有必要在C++中这样做,但是在C中,它不仅是不必要的,它还可以隐藏错误。)
ftell
不返回文件的总大小;它返回文件中当前的读或写位置。打开文件后立即调用ftell
,因此该位置是文件的最开始位置。您可以使用fseek(stock,0,SEEK_END)
在调用ftell
之前搜索到底,或者您可以下拉一个层并使用fstat(fileno(stock))
直接从操作系统检索文件大小
进一步说明:
如果您正在从管道读取数据,则这两个选项都不起作用。(通常,您需要检查每个文件访问操作是否成功。)
fread
即使您要求,也不能保证一口就能读取整个文件
正如'alk'指出的,ftell
返回的是long
,而不是int
如果long
仅为32位,则文件可能太大,以至于其大小不适合long
。如果您的程序需要处理这么大的文件,您需要在每个.c
文件的顶部(在所有包含之前)定义文件偏移量64位,并使用fseeko
和ftello
。(或任何与Windows等效的软件。)
您应该使用模式“r+b”
打开这个明显的二进制文件
没有文件头的二进制文件(特别是没有,偏移量为零时至少有四个字节)是一件坏事
不要强制转换malloc
的返回值。(有必要在C++中这样做,但是在C中,它不仅是不必要的,它还可以隐藏错误。)
不应fseek(stock,0,SEEK\u SET)代码>befseek(库存,0L,搜索结束)代码>?i、 e.转到文件末尾,然后计算位置。这篇文章似乎不是正确的答案。老实说,我只是使用了fseek(stock,0,SEEK\u END)代码>计算静止尺寸时,这就是我忘记指定偏移量的原因。P