[英]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))
直接從操作系統檢索文件大小。
補充說明:
fread
也不能保證fread
讀取整個文件。ftell
返回一個long
,而不是一個int
。long
只有 32 位,則文件可能太大以至於它的大小無法放入long
。 如果您的程序需要處理那么大的文件,您需要在每個.c
文件的頂部(在所有包含之前) #define _FILE_OFFSET_BITS 64
並使用fseeko
和ftello
。 (或任何 Windows 等價物。)"r+b"
模式打開這個明顯的二進制文件。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.