FILE *fopen(const char *path, const char *mode);
由 r/w/a + b/t + + 組合:
| 模式 | 含義 | 文件須存在 | 指針位置 | 截斷 |
|---|---|---|---|---|
| r | 只讀 | 是 | 開頭 | 否 |
| w | 只寫 | 否(不存在創建) | 開頭 | 是 |
| a | 追加寫 | 否(不存在創建) | 結尾 | 否 |
| r+ | 讀寫 | 是 | 開頭 | 否 |
| w+ | 讀寫 | 否 | 開頭 | 是 |
| a+ | 讀寫追加 | 否 | 開頭(讀)/結尾(寫) | 否 |
加 b 表示二進制(rb、wb 等),t 表示文本(默認可省略)。
FILE *fp = fopen("data.txt", "r");
if (!fp) {
perror("fopen failed");
return -1;
}
size_t fread(void *buf, size_t size, size_t count, FILE *fp);
size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp);
buf:緩衝區地址size:單個元素字節數count:元素個數// 讀取 5 個 float 到數組
float fa[5];
fread(fa, sizeof(float), 5, fp);
// 寫入結構體數組
fwrite(stu_array, sizeof(Student), 100, fp);
int fgetc(FILE *fp); // 返回字符或 EOF(-1)
int fputc(int c, FILE *fp); // 返回寫入字符或 EOF
getchar() ≡ fgetc(stdin),putchar(c) ≡ fputc(c, stdout)。
char *fgets(char *str, int n, FILE *fp); // 讀 n-1 字符或遇 \n,自動加 \0
int fputs(const char *s, FILE *fp); // 寫字符串,不自動加 \n
int fprintf(FILE *fp, const char *fmt, ...);
int fscanf(FILE *fp, const char *fmt, ...);
類似 printf/scanf,但針對文件流。
long ftell(FILE *fp); // 返回當前位置偏移(字節)
int fseek(FILE *fp, long offset, int origin); // 移動指針
void rewind(FILE *fp); // 重置到開頭 ≡ fseek(fp, 0, SEEK_SET)
| 常量 | 值 | 含義 |
|---|---|---|
| SEEK_SET | 0 | 文件開頭 |
| SEEK_CUR | 1 | 當前位置 |
| SEEK_END | 2 | 文件結尾 |
FILE *fp = fopen("data.bin", "rb");
if (!fp) return -1;
fseek(fp, 0, SEEK_END); // 移至末尾
long size = ftell(fp); // 獲取位置 = 文件大小
rewind(fp); // 回到開頭繼續讀取
// 現在可分配精確大小緩衝區讀取整個文件
char *buf = malloc(size + 1);
fread(buf, 1, size, fp);
buf[size] = '\0';
| 特性 | 文本模式 | 二進制模式 |
|---|---|---|
| 換行符 | Windows: \r\n ↔ \n 轉換 | 原樣讀寫 |
| EOF 處理 | Ctrl+Z (0x1A) 視為結束 | 無特殊處理 |
| 適用場景 | 文本文件 | 圖片、結構體、任意二進制 |
b 模式fclose,正常退出會自動關閉但不保證異常時fread/fwrite 塊操作,避免逐字符開銷