簡體   English   中英

為什么 ftell 在這個函數中返回 0?

[英]Why the ftell returns 0 in this function?

當我運行我的程序並選擇查看產品列表時,它不會打印任何內容。 過了一段時間,發現fl_size的值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);
}

ftell不返回文件的總大小; 它返回文件中的當前讀取或寫入位置 打開文件后立即調用ftell ,因此該位置是文件的開頭。 您可以在調用ftell之前使用fseek(stock, 0, SEEK_END)尋找到最后,或者您可以下拉一個層並使用fstat(fileno(stock))直接從操作系統檢索文件大小。

補充說明:

  1. 如果您從管道中讀取,這些選項都不起作用。 (通常,您需要檢查每個文件訪問操作是否成功。)
  2. 即使您要求fread也不能保證fread讀取整個文件。
  3. 正如 'alk' 指出的那樣, ftell返回一個long ,而不是一個int
  4. 如果long只有 32 位,則文件可能太大以至於它的大小無法放入long 如果您的程序需要處理那么大的文件,您需要在每個.c文件的頂部(在所有包含之前) #define _FILE_OFFSET_BITS 64並使用fseekoftello (或任何 Windows 等價物。)
  5. 您應該使用"r+b"模式打開這個明顯的二進制文件。
  6. 沒有文件頭的二進制文件(特別是沒有幻數,至少四個字節,偏移量為零)是一件壞事。
  7. 不要malloc的返回值。 (在 C++ 中必須這樣做,但在 C 中它不僅沒有必要,而且可以隱藏錯誤。)

檢查ftell手冊頁,例如這個: http : //linux.die.net/man/3/ftell

這是相關部分: “ftell() 函數獲取流指向的流的文件位置指示符的當前值。”

當您打開文件時,光標位置將在開頭。 所以與開始的距離將為零。 因此ftell返回零。

要查找文件的大小,請參閱此鏈接: How can I get a file's size in C? . 這是一個簡短的片段:

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);

確保調用fseek(fp, 0L, SEEK_SET); 以上之后。

因為ftell返回的是文件從開始到當前位置的大小。

fseek(stock,0,SEEK_SET);

意味着您將位置設置為文件的第一口。

你還必須設置fl_size=ftell(stock); fseek

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM