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

C語言文件操作詳解(二):fopen 進階、fclose 與四大讀寫函數族

     編輯:C 語言基礎

fopen 進階細節

路徑處理


// Windows 路徑轉義
FILE *fp = fopen("C:\\data\\file.bin", "rb");  // 雙反斜線
// 或正斜線(跨平台友好)
FILE *fp = fopen("C:/data/file.bin", "rb");

文本模式換行轉換

  • Windows:文本讀取時 \r\n → \n;寫入時 \n → \r\n。
  • Linux/macOS:無轉換(原生 \n)。
  • 二進制模式(b):所有平台無轉換,位模式完全保真。

錯誤診斷


if ((fp = fopen("file.txt", "r")) == NULL) {
    perror("fopen");           // 輸出系統錯誤信息
    // 或自定義
    fprintf(stderr, "Cannot open %s: %s\n", "file.txt", strerror(errno));
    exit(EXIT_FAILURE);
}

文件關閉 fclose


int fclose(FILE *fp);
  • 刷新輸出緩衝區(確保數據落盤)。
  • 釋放文件鎖、文件描述符、FILE 結構體內存。
  • 返回 0 成功,EOF(通常 -1)失敗。
  • 注意:fclose(NULL) 行為未定義,必須先判空。

四大讀寫函數族

族函數單位典型用途
字符fgetc/fputc字節逐字符處理、文本流過濾
字符串fgets/fputs行/字符串文本行讀寫、配置文件解析
數據塊fread/fwrite字節塊結構體、數組、二進制數據批量讀寫
格式化fscanf/fprintf格式化文本數據解析/生成、日誌、CSV

所有函數需 #include <stdio.h>。

字符讀寫:fgetc / fputc

fgetc - 讀取單字符


int fgetc(FILE *fp);
  • 返回:讀到的字符(unsigned char 轉 int),EOF (-1) 表示結束或出錯。
  • 文件內部位置指針自動後移 1 字節。
  • 必須用 int 接收返回值,不能用 char(無法區分 EOF 與合法 0xFF)。

fputc - 寫入單字符


int fputc(int c, FILE *fp);
  • 將 c 低 8 位寫入文件,位置指針後移。
  • 返回寫入字符,錯誤返回 EOF。

完整示例:文件複製(字符級)


#include 
#include 

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s src dst\n", argv[0]);
        return 1;
    }
    FILE *src = fopen(argv[1], "rb");
    if (!src) { perror(argv[1]); return 1; }
    FILE *dst = fopen(argv[2], "wb");
    if (!dst) { perror(argv[2]); fclose(src); return 1; }

    int ch;
    while ((ch = fgetc(src)) != EOF) {
        if (fputc(ch, dst) == EOF) {
            perror("fputc");
            break;
        }
    }

    fclose(src);
    fclose(dst);
    return 0;
}

內部位置指針 vs 文件指針

  • 文件指針 FILE*:程序聲明的變量,指向文件控制結構體,值不變(除非重新賦值)。
  • 內部位置指針:FILE 結構體內部維護,指示下一次讀寫的字節偏移。打開文件指向開頭,每次讀寫自動後移。可用 fseek/ftell/rewind 控制。

總結

  • fopen 模式選擇決定文件行為,二進制模式跨平台安全。
  • fclose 必須調用,防止數據滯留緩衝區。
  • 四大讀寫族各有優勢:字符級控制精細、行級適合文本、塊級高效處理二進制結構、格式化便於文本解析。
  • fgetc 返回 int 以區分 EOF,切勿用 char。
  • 內部位置指針自動維護,fseek 可隨機訪問(下章講解)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved