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

时间:2014-06-03 15:54:25

标签: 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);
}

3 个答案:

答案 0 :(得分:6)

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

补充说明:

  1. 如果您正在阅读管道,这些选项都不会起作用。 (通常,您需要检查每个文件访问操作是否成功。)
  2. fread无法保证即使您要求也可以一口气读取整个文件。
  3. 正如'alk'所指出的,ftell会返回long,而非int
  4. 您应该使用模式"r+b"打开这个明显为二进制的文件。
  5. 没有文件头的二进制文件(特别是没有magic number,至少有四个字节,偏移为零)是一件坏事。
  6. 不要转换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