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)be
    fseek(库存,0L,搜索结束)?i、 e.转到文件末尾,然后计算位置。这篇文章似乎不是正确的答案。老实说,我只是使用了
    fseek(stock,0,SEEK\u END)计算静止尺寸时,这就是我忘记指定偏移量的原因。P