// Windows 路徑轉義
FILE *fp = fopen("C:\\data\\file.bin", "rb"); // 雙反斜線
// 或正斜線(跨平台友好)
FILE *fp = fopen("C:/data/file.bin", "rb");
\r\n → \n;寫入時 \n → \r\n。\n)。b):所有平台無轉換,位模式完全保真。
if ((fp = fopen("file.txt", "r")) == NULL) {
perror("fopen"); // 輸出系統錯誤信息
// 或自定義
fprintf(stderr, "Cannot open %s: %s\n", "file.txt", strerror(errno));
exit(EXIT_FAILURE);
}
int fclose(FILE *fp);
FILE 結構體內存。fclose(NULL) 行為未定義,必須先判空。| 族 | 函數 | 單位 | 典型用途 |
|---|---|---|---|
| 字符 | fgetc/fputc | 字節 | 逐字符處理、文本流過濾 |
| 字符串 | fgets/fputs | 行/字符串 | 文本行讀寫、配置文件解析 |
| 數據塊 | fread/fwrite | 字節塊 | 結構體、數組、二進制數據批量讀寫 |
| 格式化 | fscanf/fprintf | 格式化 | 文本數據解析/生成、日誌、CSV |
所有函數需 #include <stdio.h>。
int fgetc(FILE *fp);
unsigned char 轉 int),EOF (-1) 表示結束或出錯。int 接收返回值,不能用 char(無法區分 EOF 與合法 0xFF)。
int fputc(int c, FILE *fp);
c 低 8 位寫入文件,位置指針後移。
#include
#include
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s src dst\n", argv[0]);
return 1;
}
FILE *src = fopen(argv[1], "rb");
if (!src) { perror(argv[1]); return 1; }
FILE *dst = fopen(argv[2], "wb");
if (!dst) { perror(argv[2]); fclose(src); return 1; }
int ch;
while ((ch = fgetc(src)) != EOF) {
if (fputc(ch, dst) == EOF) {
perror("fputc");
break;
}
}
fclose(src);
fclose(dst);
return 0;
}
FILE*:程序聲明的變量,指向文件控制結構體,值不變(除非重新賦值)。FILE 結構體內部維護,指示下一次讀寫的字節偏移。打開文件指向開頭,每次讀寫自動後移。可用 fseek/ftell/rewind 控制。fopen 模式選擇決定文件行為,二進制模式跨平台安全。fclose 必須調用,防止數據滯留緩衝區。fgetc 返回 int 以區分 EOF,切勿用 char。fseek 可隨機訪問(下章講解)。