FILE* 的本質C 語言通過 FILE 結構體(定義於 stdio.h)維護文件狀態:文件描述符、緩衝區指針、操作模式、當前讀寫位置等。程序不直接操作結構體,而是通過文件指針 FILE* fp 間接訪問。每打開一個文件,系統分配一個 FILE 結構體,fp 指向其首地址。
fopen —— 打開文件FILE* fopen(const char* filename, const char* mode);
常用模式組合(r讀 w寫 a追加 b二進制 +讀寫):
| 模式 | 含義 |
|---|---|
r/rt | 只讀打開文本文件,文件必須存在 |
w/wt | 只寫打開文本文件,不存在則創建,存在則清空 |
a/at | 追加寫入文本文件,不存在則創建 |
rb/wb/ab | 對應二進制文件操作 |
r+/w+/a+ | 文本文件讀寫 |
rb+/wb+/ab+ | 二進制文件讀寫 |
返回值:成功返回文件指針,失敗返回 NULL。必須檢查返回值:
FILE* fp;
if ((fp = fopen("e:\\test.txt", "rt")) == NULL) {
printf("Cannot open file!");
exit(1);
}
fclose —— 關閉文件int fclose(FILE* fp);
流程:刷新緩衝區→寫盤→釋放 FILE 結構體→置 fp 為空指針。返回 0 表示成功,非 0 表示錯誤。
fgetc / fputc(等價於 getc/putc)int fgetc(FILE* fp):讀取一字符,返回字符值;遇 EOF 返回 EOF(-1)。int fputc(int ch, FILE* fp):寫入一字符,成功返回該字符,失敗返回 EOF。示例:逐字符複製文件內容到標準輸出
int ch = fgetc(fp);
while (ch != EOF) {
putchar(ch);
ch = fgetc(fp);
}
fgets / fputschar* fgets(char* buf, int n, FILE* fp):讀取最多 n-1 字符或至換行/EOF,保留 \n,末尾補 \0。int fputs(const char* str, FILE* fp):寫入字符串(不含結束符),成功返回非負,失敗返回 EOF。fread / fwritesize_t fread(void* ptr, size_t size, size_t count, FILE* fp); size_t fwrite(const void* ptr, size_t size, size_t count, FILE* fp);
按 size 字節為單位讀寫 count 塊,返回實際塊數。適合結構體、數組批量存取。
fscanf / fprintf類似 scanf/printf,多一個 FILE* 參數,支持格式化字符串解析與生成。
FILE* fp = fopen("e:\\test.txt", "wt+");
char ch = getchar();
while (ch != '\n') { fputc(ch, fp); ch = getchar(); }
rewind(fp); // 指針回文件頭
ch = fgetc(fp);
while (ch != EOF) { putchar(ch); ch = fgetc(fp); }
fclose(fp);
注意:wt+ 會清空原文件內容;若需保留原內容追加,請用 at+。


\\ 或正斜杠 /。r/r+,寫操作需 w/a/+,否則 fgetc/fputc 失敗。printf 可能顯示舊數據,文件讀寫演示建議用 write/putchar 直接輸出。\r\n,二進制模式不轉換,跨平台處理二進制數據必須加 b。本文系統梳理了 C 文件操作的核心 API、模式選擇、錯誤處理與實戰技巧。下一篇將深入講解 fseek/ftell 隨機訪問、fread/fwrite 結構體序列化等進階主題。本文出自「趙玉強的博客」:原文鏈接