FILE *fopen(const char *path, const char *mode);
| 模式 | 說明 |
|---|---|
| r | 只讀,文件必須存在 |
| w | 只寫,截斷或創建 |
| a | 追加寫,保留原內容 |
| r+ | 讀寫,文件必須存在 |
| w+ | 讀寫,截斷或創建 |
| a+ | 追加讀寫,創建或保留 |
二進制標誌:加 b(如 rb、wb+),Windows 下區分換行符處理。
錯誤處理範式:
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:元素個數示例:fread(fa, 4, 5, fp) 讀 5 個 float(每個 4 字節)到數組 fa。
int fgetc(FILE *fp); // 讀取一字符,返回字符值或 EOF(-1)
int fputc(int ch, FILE *fp); // 寫入一字符,返回寫入字符或 EOF
宏定義關係:#define getc(fp) fgetc(fp)、#define putchar(ch) fputc(ch, stdout)
char *fgets(char *str, int n, FILE *fp); // 讀 n-1 字符或遇到換行
int fputs(const char *str, FILE *fp); // 寫字符串(不含 \0)
int fprintf(FILE *fp, const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
類似 printf/scanf 但針對文件流。
long ftell(FILE *fp); // 獲取當前偏移量
int fseek(FILE *fp, long offset, int origin); // 移動指針
int rewind(FILE *fp); // 重置到文件頭
| origin | 值 | 基準位置 |
|---|---|---|
| SEEK_SET | 0 | 文件開頭 |
| SEEK_CUR | 1 | 當前位置 |
| SEEK_END | 2 | 文件末尾 |
FILE *fp = fopen("test.txt", "r");
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
rewind(fp); // 回到開頭繼續處理
int fclose(FILE *fp); // 刷新緩衝區、釋放資源、關閉文件描述符
進程正常退出會自動關閉所有流,異常退出不保證刷新。
typedef struct {
int id;
char name[20];
float score;
} Student;
void save_students(Student *arr, int n, const char *file) {
FILE *fp = fopen(file, "wb");
fwrite(arr, sizeof(Student), n, fp);
fclose(fp);
}
void load_students(Student *arr, int n, const char *file) {
FILE *fp = fopen(file, "rb");
fread(arr, sizeof(Student), n, fp);
fclose(fp);
}