在 C 語言中,fseek() 與 ftell() 組合是取得檔案大小的標準做法。原理:將檔案指標移至檔案尾端,再查詢相對檔案開頭的位移量,即為檔案總位元組數。此法適用於二進位與文字檔,常用於動態配置讀取緩衝區或檔案複製前預估空間。
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
whence:SEEK_SET(開頭)、SEEK_CUR(目前)、SEEK_END(結尾)。offset:相對 whence 的位移量。ftell 回傳目前位置距檔案開頭的位元組數。FILE *fp = fopen("filename", "rb"); // 建議用二進位模式避免換行轉換
if (fp) {
fseek(fp, 0, SEEK_END); // 移至檔案結尾
long size = ftell(fp); // 取得位移量 = 檔案大小
fclose(fp);
printf("檔案大小:%ld bytes\n", size);
}
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("addoverflowDemo.c", "rb");
if (!fp) { perror("開檔失敗"); return -1; }
fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
fclose(fp);
printf("檔案位元組數:%ld\n", fsize);
return 0;
}
\r\n 轉為 \n,導致 ftell 傳回值小於實體磁碟大小;建議一律用 "rb" 開啟。fseeko/ftello (off_t) 或平台專用 API (如 _fseeki64)。fseek 成功回傳 0,失敗回傳非 0,生產級代碼應檢查回傳值。此技巧為 C 語言檔案處理核心技能,廣泛應用於檔案上傳驗證、記憶體映射預分配、串流媒體分段等場景。