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

C 語言檔案操作完整指南:FILE 結構、標準 I/O 函式與實戰範例

     編輯:關於C語言

C 語言檔案操作完整指南:FILE 結構、標準 I/O 函式與實戰範例

檔案操作是 C 語言系統程式設計的核心技能。本文系統整理 FILE* 指標、開檔模式、字元/字串/區塊讀寫、隨機存取、緩衝區控制等關鍵知識,並附上可直接編譯執行的完整範例程式碼。

一、FILE* 與 fopen()

FILE *fp = fopen("路徑/檔名", "開檔模式");
  • FILE 為 stdio.h 定義的結構,內含檔名、狀態、讀寫位置等資訊
  • fp 指向該結構,透過它操作實體檔案
  • 開檔失敗回傳 NULL,務必檢查

開檔模式對照表

模式說明檔案須存在建立新檔可讀可寫定位
r文字檔讀取是否✓✗開頭
w文字檔寫入否是(截斷)✗✓開頭
a文字檔附加否是✗✓末尾
rb二進位檔讀取是否✓✗開頭
wb二進位檔寫入否是(截斷)✗✓開頭
ab二進位檔附加否是✗✓末尾
r+文字檔讀/寫是否✓✓開頭
w+文字檔建立讀/寫否是(截斷)✓✓開頭
a+文字檔開啟讀/寫否是✓✓末尾
rb+二進位檔讀/寫是否✓✓開頭
wb+二進位檔建立讀/寫否是(截斷)✓✓開頭
ab+二進位檔開啟讀/寫否是✓✓末尾

二、字元/字串順序讀寫

函式原型說明失敗回傳
fgetcint fgetc(FILE *fp)讀取單一字元EOF
fputcint fputc(int ch, FILE *fp)寫入單一字元EOF
fgetschar *fgets(char *buf, int size, FILE *fp)讀取一行(含換行、以 \0 結尾)NULL
fputsint fputs(const char *buf, FILE *fp)寫入字串(不自動加換行)EOF

三、隨機存取:rewind、fseek、ftell

void rewind(FILE *fp);                    // 定位至檔案開頭
int fseek(FILE *fp, long offset, int whence); // 移動讀寫位置
long ftell(FILE *fp);                     // 取得目前位置(位元組偏移)

whence 取值

  • SEEK_SET:檔案開頭 + offset
  • SEEK_CUR:目前位置 + offset
  • SEEK_END:檔案結尾 + offset

fseek 成功回傳 0,失敗 -1。

範例:取得檔案大小

#include <stdio.h>
int main() {
    FILE *fp;
    char filename[80];
    long length;
    printf("Input the file name: ");
    gets(filename);  // 教學用,實務請用 fgets
    fp = fopen(filename, "rb");
    if (fp == NULL) {
        printf("file not found!\n");
    } else {
        fseek(fp, 0, SEEK_END);
        length = ftell(fp);
        printf("the file length %ld bytes\n", length);
        fclose(fp);
    }
    return 0;
}

四、區塊讀寫:fread、fwrite

size_t fread(void *buffer, size_t size, size_t count, FILE *fp);
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *fp);
  • buffer:資料緩衝區位址
  • size:單一資料項大小(位元組)
  • count:資料項數量
  • 回傳實際讀寫的項數

範例:二進位陣列存取

#include <stdio.h>
int main() {
    FILE *pFile;
    float buffer[] = { 2.0, 3.0, 8.0 };
    pFile = fopen("myfile.bin", "wb");
    fwrite(buffer, 1, sizeof(buffer), pFile);  // 寫入整個陣列位元組
    fclose(pFile);
    float read[3];
    pFile = fopen("myfile.bin", "rb");
    fread(read, 1, sizeof(read), pFile);
    printf("%f\t%f\t%f\n", read[0], read[1], read[2]);
    fclose(pFile);
    return 0;
}

五、緩衝區控制:fflush

int fflush(FILE *fp);
  • 強制將輸出緩衝區資料寫入檔案
  • fp == NULL:刷新所有開啟檔案
  • 成功回傳 0,失敗 EOF(錯誤碼存於 errno)

六、關鍵提醒與最佳實務

  1. 永遠檢查 fopen 回傳值,失敗時處理錯誤
  2. 二進位模式(b)跨平台相容性佳,避免換行符轉換差異
  3. fgets 保留換行符,處理時需自行移除
  4. fread/fwrite 配合 sizeof 計算位元組數,避免硬編碼
  5. 程式結束前務必 fclose 釋放資源,確保緩衝區寫入
  6. 避免使用 gets(已移除標準),改用 fgets

掌握上述 API 與模式,即能應對絕大多數 C 語言檔案處理需求。建議實際撰寫小程式驗證各模式行為,深入體會緩衝機制與隨機存取的威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved