C 語言透過 FILE * 指標操作文件。fopen() 返回文件指標,失敗返回 NULL。
| 模式 | 含義 |
|---|---|
rt | 唯讀開啟文字檔,不存在報錯 |
wt | 唯寫開啟/建立文字檔,截斷為零長度 |
at | 追加開啟/建立文字檔,寫入位置在檔尾 |
rb | 唯讀開啟二進制檔 |
wb | 唯寫開啟/建立二進制檔,截斷 |
ab | 追加開啟/建立二進制檔 |
rt+ | 讀寫開啟文字檔,不存在報錯 |
wt+ | 讀寫開啟/建立文字檔,截斷 |
at+ | 讀寫開啟文字檔,讀從頭,寫在尾 |
rb+ | 讀寫開啟二進制檔 |
wb+ | 讀寫開啟/建立二進制檔,截斷 |
ab+ | 讀寫開啟二進制檔,讀從頭,寫在尾 |
| 類別 | 讀取 | 寫入 | 適用場景 |
|---|---|---|---|
| 字元 | fgetc() | fputc() | 逐字元處理,簡單文本 |
| 格式化 | fscanf() | fprintf() | 結構化數據(整數、浮點、字串) |
| 二進制區塊 | fread() | fwrite() | 結構體、陣列、高效大量數據 |
| 字串/行 | fgets() | fputs() | 逐行讀寫文本文件 |
fclose(fp):刷新緩衝區、釋放資源、置指標無效。必須成對調用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NUM 99999
FILE *fp;
char buf[NUM];
// 開啟/建立文件:mode=1寫文本, 2讀文本, 3寫二進制, 4讀二進制
void build(int mode) {
const char *fname = (mode <= 2) ? "d:/1234.txt" : "d:/1234";
const char *fmode[] = { "", "w", "r", "wb", "rb" };
if ((fp = fopen(fname, fmode[mode])) == NULL) {
printf("open file error\n"); getchar(); exit(1);
}
}
void close_file() { fclose(fp); }
// 生成測試數據並寫入
void write_test() {
for (int i = 0; i < NUM; i++) buf[i] = 'a' + (i % 26);
clock_t start = clock();
for (int i = 0; i < NUM; i++) fputc(buf[i], fp);
printf("fputc 寫入耗時: %.3f 秒\n", (double)(clock() - start) / CLOCKS_PER_SEC);
}
// 讀取並計時
void read_test() {
int ch; clock_t start = clock();
while ((ch = fgetc(fp)) != EOF);
printf("fgetc 讀取耗時: %.3f 秒\n", (double)(clock() - start) / CLOCKS_PER_SEC);
}
int main() {
// 1. 寫入文本測試
build(1); write_test(); close_file();
// 2. 讀取文本測試
build(2); read_test(); close_file();
// 3. 寫入二進制測試
build(3); write_test(); close_file();
// 4. 讀取二進制測試
build(4); read_test(); close_file();
return 0;
}
\n ⇄ \r\n,二進制模式不轉換。跨平台處理二進制數據必須用 b 模式。fflush(fp) 強制寫入磁碟;fclose 會自動刷新。fopen、fread/fwrite 後檢查返回值,ferror(fp) 判斷錯誤,feof(fp) 判斷檔尾。fseek(fp, offset, SEEK_SET/CUR/END)、ftell(fp)、rewind(fp)。