標準流程
fopen(..., "rb") 二進制打開;
fseek(fp, 0, SEEK_END) 移至文件末尾;
ftell(fp) 獲取位置即文件大小;
fseek(fp, 0, SEEK_SET) 回到開頭;
malloc(size) 精確分配內存;
fread(buf, 1, size, fp) 一次性讀取;
- 處理數據;
free(buf)、fclose(fp) 釋放資源。
代碼實現
FILE *fp = fopen("data.bin", "rb");
if (!fp) { perror("open"); return; }
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char *buf = malloc(size);
if (!buf) { perror("malloc"); fclose(fp); return; }
fread(buf, 1, size, fp);
// 使用 buf...
free(buf);
fclose(fp);
關鍵優勢
- 精確分配,無內存浪費;
- 二進制模式跨平台一致(Windows 文本模式會轉換換行符);
- 一次性讀取,I/O 效率高。
注意事項
ftell 返回 long,大文件(>2GB)需用 fseeko/ftello (POSIX) 或 _fseeki64/_ftelli64 (Windows);
- 檢查
malloc 返回值;
- 文本文件若需按行處理,改用
fgets 循環讀取。