为什么ftell在这个函数中返回0?

Dot*_*Dot 1 c ftell

当我运行我的程序并且我选择查看产品列表时,它不会打印任何内容.过了一段时间,我发现它的值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);
}
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 6

ftell不返回文件的总大小; 它返回文件中的当前读取或写入位置.ftell打开文件后立即调用,因此该位置是文件的开头.您可以fseek(stock, 0, SEEK_END)在调用之前使用查找结束ftell,也可以fstat(fileno(stock))直接从操作系统下拉图层并使用它来检索文件大小.

附加说明:

  1. 如果您正在读取管道,这些选项都不会起作用.(通常,您需要检查每个文件访问操作是否成功.)
  2. fread 即使您要求,也不保证能够一口气读取整个文件.
  3. 正如'alk'指出的那样,ftell返回a long,而不是a int.
  4. 你应该用模式打开这个明显的二进制文件"r+b".
  5. 没有文件头的二进制文件(特别是没有幻数,至少四个字节,偏移零)是一件坏事.
  6. 不要强制转换返回值malloc.(有必要在C++中执行此操作,但在C中它不仅是不必要的,它可以隐藏错误.)

  • +1用于打开二进制文件并评论`fread()`。 (2认同)