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

C 語言 fopen 完整指南:檔案開啟模式、錯誤處理與最佳實踐

     編輯:關於C

函式原型

FILE *fopen(const char *path, const char *mode);

模式字串完整對照表

模式說明檔案必須存在截斷/清空讀/寫
r唯讀開啟文字檔是否讀
r+讀寫開啟文字檔是否讀/寫
w唯寫開啟文字檔否(不存在則建立)是(長度歸零)寫
w+讀寫開啟文字檔否是讀/寫
a附加模式唯寫文字檔否否(寫入位置在檔尾)寫
a+附加模式讀寫文字檔否否讀/寫
rb唯讀二進制檔是否讀
wb唯寫二進制檔否是寫
ab附加唯寫二進制檔否否寫
rb+/r+b讀寫二進制檔是否讀/寫
wb+/w+b讀寫二進制檔(截斷)否是讀/寫
ab+/a+b附加讀寫二進制檔否否讀/寫

註:b 表示二進制模式,無 b 預設文字模式(t)。Windows 下文字模式會自動轉換 \n ↔ \r\n;Linux 無差異。

回傳值與錯誤處理

  • 成功:回傳 FILE* 指標。
  • 失敗:回傳 NULL,並設定 errno。
  • 務必檢查回傳值,失敗時輸出錯誤訊息並適當處理(返回錯誤碼、跳過、終止程式)。

完整範例:安全開啟、讀取、關閉

#include <stdio.h>
#include <stdlib.h>

#define F_PATH "d:/myfile/file.dat"

int main(void)
{
    FILE *fp = NULL;                 // 1. 初始化為 NULL

    fp = fopen(F_PATH, "r");
    if (fp == NULL) {
        perror("fopen");             // 印出系統錯誤訊息
        return -1;
    }

    // ... 檔案操作 ...

    fclose(fp);                      // 2. 關閉檔案
    fp = NULL;                       // 3. 指標歸零,防止游離指標
    return 0;
}

三大鐵律

  1. 宣告即歸零:FILE *fp = NULL;
  2. 用畢即關閉:fclose(fp);
  3. 關閉即歸零:fp = NULL;

違反任一鐵律皆可能導致資源洩漏、游離指標、重複關閉崩潰。

進階範例:多檔案操作與 _fcloseall

FILE *fp1 = fopen("a.txt", "r");
FILE *fp2 = fopen("b.txt", "w+");

if (fp1) { fclose(fp1); fp1 = NULL; }
if (fp2) { fclose(fp2); fp2 = NULL; }

// 關閉所有開啟檔案(MSVC 擴展)
int closed = _fcloseall();
printf("Closed %d files\n", closed);

文字 vs 二進制模式實測差異

// Windows
fputs("line\n", fp_text);   // 實際寫入 \"line\r\n\"
fputs("line\n", fp_bin);    // 實際寫入 \"line\n\"

// Linux
// 兩者皆寫入 \"line\n\"

跨平台處理二進制資料(圖片、序列化結構體)必須加 b。

常見錯誤與避坑

  • 忘記檢查 fopen 回傳值 → 後續操作 NULL 崩潰。
  • 檔名未含副檔名/路徑錯誤 → ENOENT。
  • w 模式誤以為會保留舊內容 → 實際會截斷。
  • 未關閉檔案就結束程式 → 資料可能未刷新至磁碟(fflush/fclose 會刷新)。
  • 關閉後未歸零指標 → 後續誤用導致未定義行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved