首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言文件操作完整指南 - 從基礎到隨機訪問

     編輯:關於C

1. 文件與流

C 語言將文件視為位元組流。程序啟動自動打開三個標準流:stdin(鍵盤)、stdout(屏幕)、stderr(錯誤輸出)。文件操作通過 FILE* 指針進行,內部封裝了文件描述符、緩衝區指針、標誌位等信息。

2. 文件操作底層機制

  • FILE 結構(_iobuf)包含:緩衝區指針 _ptr、剩餘字符數 _cnt、緩衝區基址 _base、標誌 _flag、文件描述符 _file 等。
  • 文件描述符是進程打開文件表的索引,指向系統級打開文件表,後者指向文件控制塊 FCB,最終操作物理磁盤。
  • 同一文件多次 fopen 會在進程級表創建多個獨立項,各自維護獨立的文件位置指針。

3. 順序訪問文件

3.1 打開模式

模式說明
r只讀,文件必須存在
w只寫,創建或截斷
a追加寫入,創建或定位到末尾
r+讀寫,文件必須存在
w+讀寫,創建或截斷
a+讀寫追加

二進制模式在字母後加 b(如 rb、wb),Windows 下影響換行符轉換。

3.2 寫入示例

FILE *fp = fopen("data.txt", "w");
if (!fp) { perror("open"); return 1; }
fprintf(fp, "%d %s %.2f\n", 100, "Alice", 123.45);
fclose(fp);

3.3 讀取示例

FILE *fp = fopen("data.txt", "r");
int id; char name[32]; double bal;
while (fscanf(fp, "%d %s %lf", &id, name, &bal) == 3)
    printf("%d %s %.2f\n", id, name, bal);
fclose(fp);

3.4 重置位置

rewind(fp) 將位置指針移回文件開頭,等價於 fseek(fp, 0, SEEK_SET)。

4. 隨機訪問文件

固定長度記錄(通常用 struct),配合 fseek、fread、fwrite 實現 O(1) 定位。

4.1 結構定義

struct Record {
    int id;
    char name[20];
    double balance;
};

4.2 創建空文件(預分配)

FILE *fp = fopen("records.dat", "wb");
struct Record blank = {0};
for (int i = 0; i < 100; i++)
    fwrite(&blank, sizeof(blank), 1, fp);
fclose(fp);

4.3 隨機寫入

FILE *fp = fopen("records.dat", "rb+");
struct Record r = {10, "Bob", 500.0};
fseek(fp, (r.id-1)*sizeof(r), SEEK_SET); // 定位
fwrite(&r, sizeof(r), 1, fp);
fclose(fp);

4.4 隨機讀取

FILE *fp = fopen("records.dat", "rb");
struct Record r;
fseek(fp, 5*sizeof(r), SEEK_SET); // 讀第6條
fread(&r, sizeof(r), 1, fp);
printf("%d %s %.2f\n", r.id, r.name, r.balance);
fclose(fp);

5. 關鍵函數速查

函數用途
fopen/fclose打開/關閉文件
fprintf/fscanf格式化文本讀寫
fread/fwrite二進制塊讀寫
fseek/ftell位置定位/獲取(長整型偏移)
fgetpos/fsetpos位置定位/獲取(fpos_t 類型)
rewind回到文件開頭
feof/ferror/clearerr狀態檢查
setbuf/setvbuf設置緩衝模式
remove/rename刪除/重命名
tmpfile/tmpnam臨時文件

6. 最佳實踐

  • 總是檢查 fopen 返回值,失敗時用 perror 輸出錯誤。
  • 文本模式下跨平台換行符差異(Windows \r\n vs Unix \n),二進制模式無此問題。
  • 隨機訪問必須用二進制模式(b),確保偏移計算準確。
  • 結構體寫入文件涉及對齊與端序問題,跨平台交換建議用文本或序列化格式(JSON/Protobuf)。
  • 及時 fclose 釋放資源,刷新緩衝區。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved