文件指針操作核心函數速查
| 函數 | 頭文件 | 功能 | 關鍵參數/返回值 |
fopen | stdio.h | 打開文件 | 模式: r/w/a/r+/w+/a+/rb/wb... 返回 FILE* 或 NULL |
fclose | stdio.h | 關閉文件,刷新緩衝區 | 成功 0,失敗 EOF |
fread | stdio.h | 二進制讀取 | size_t fread(ptr, size, nmemb, fp) 返回實際讀取項數 |
fwrite | stdio.h | 二進制寫入 | size_t fwrite(ptr, size, nmemb, fp) 返回實際寫入項數 |
fseek | stdio.h | 移動讀寫位置 | int fseek(fp, offset, SEEK_SET/CUR/END) 成功 0 |
ftell | stdio.h | 獲取當前位置 | long ftell(fp) 返回位移,錯誤 -1 |
rewind | stdio.h | 定位到文件開頭 | 等價 fseek(fp,0,SEEK_SET) |
fgetc/getc | stdio.h | 讀單字符 | 返回字符值或 EOF |
fputc/putc | stdio.h | 寫單字符 | 返回寫入字符或 EOF |
fgets | stdio.h | 讀一行(含換行) | char* fgets(buf, size, fp) 返回 buf 或 NULL |
fputs | stdio.h | 寫字符串(不加換行) | 成功非負,失敗 EOF |
feof | stdio.h | 判斷文件結束 | 非零=已到末尾 |
ferror | stdio.h | 判斷錯誤狀態 | 非零=發生錯誤 |
clearerr | stdio.h | 清除錯誤/EOF 標誌 | 無返回值 |
fflush | stdio.h | 刷新輸出緩衝區 | 成功 0,失敗 EOF |
setvbuf | stdio.h | 設置緩衝模式 | _IOFBF/_IOLBF/_IONBF |
freopen | stdio.h | 重新打開文件流 | 關閉舊流,打開新路徑 |
fileno | stdio.h | 獲取文件描述符 | 返回 int fd |
fdopen | stdio.h | 文件描述符轉 FILE* | 模式需與 fd 一致 |
tmpfile | stdio.h | 創建臨時文件 | 自動刪除,返回 FILE* |
remove | stdio.h | 刪除文件 | 成功 0 |
rename | stdio.h | 重命名文件 | 成功 0 |
常用模式字符串
"r" 只讀,文件必須存在
"w" 只寫,截斷或創建
"a" 追加寫入,創建
"r+" 讀寫,文件必須存在
"w+" 讀寫,截斷或創建
"a+" 讀寫,追加
加 'b' 表示二進制模式(Windows 區分換行轉換,Linux 忽略)
二進制結構體讀寫範例
struct Rec { char name[20]; int val; } rec[3];
FILE *fp = fopen("data.bin", "wb");
fwrite(rec, sizeof(struct Rec), 3, fp);
fclose(fp);
fp = fopen("data.bin", "rb");
fread(rec, sizeof(struct Rec), 3, fp);
for(int i=0;i<3;i++) printf("%s %d\n", rec[i].name, rec[i].val);
fclose(fp);
錯誤處理模板
FILE *fp = fopen("file.txt", "r");
if (!fp) { perror("fopen"); return -1; }
/* 操作... */
if (ferror(fp)) { perror("IO error"); }
fclose(fp);