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

C語言檔案 I/O 基礎:標準檔案函數與緩衝機制入門

     編輯:關於C語言

前言:一切皆檔案

在 C 語言中,鍵盤、螢幕、印表機、磁碟等邏輯裝置均視為「檔案」操作。標準檔案函數(ANSI C)提供緩衝 I/O,以 FILE* 為統一介面,支援順序與隨機讀寫。

一、標準檔案函數分類

類別函數說明
開啟/關閉fopen/fclose建立/釋放串流
freopen重新導向現有串流
順序讀寫fgetc/fputc字元級
fgets/fputs字串級
格式化fscanf/fprintf格式化掃描/列印
fread/fwrite二進制塊讀寫
隨機定位fseek/rewind/ftell移動/歸零/查詢位置指標
fgetpos/fsetpos大檔案支援 (POSIX)
狀態查詢feof/ferror/clearerr/filenoEOF/錯誤/清除/取得檔案描述符

二、緩衝機制核心概念

  • 輸出緩衝區:fprintf/fwrite 先寫入緩衝區,滿或 fclose/fflush 才落盤
  • 輸入緩衝區:fread 從磁碟讀入一塊資料到緩衝區,後續 fgetc 從緩衝區取字元
  • 行緩衝:終端機輸出遇 \n 刷新
  • 全緩衝:檔案輸出滿緩衝區 (通常 4KB/8KB) 刷新
  • 無緩衝:stderr 預設,立即輸出

fflush 強制刷新


int fflush(FILE *stream);
// 成功返回 0,失敗返回 EOF
// 刷新輸出緩衝區至裝置,丟棄輸入緩衝區內容

關鍵資料寫入後立即 fflush(fp) 可防止程式異常終止導致資料遺失。

三、標準串流預設開啟

串流裝置對應函數
stdin鍵盤scanf、getchar、fgets
stdout螢幕printf、putchar、puts
stderr螢幕fprintf(stderr, ...)、perror

這三個串流在程式啟動時自動開啟,無需 fopen。

四、順序讀寫基礎範例

字元級:fgetc/fputc


// 複製檔案
FILE *src = fopen("src.txt", "r");
FILE *dst = fopen("dst.txt", "w");
int ch;
while ((ch = fgetc(src)) != EOF)
    fputc(ch, dst);
fclose(src); fclose(dst);

字串級:fgets/fputs


// 逐行讀取
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
    fputs(line, stdout);  // 含換行符
}

注意:fgets 保留 \n,gets (已棄用) 丟棄 \n 且不安全。

五、檔案複製完整範例(支援命令列參數)


#include 
#include 

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s  [dst]\n", argv[0]);
        return 1;
    }

    FILE *fp1 = fopen(argv[1], "r");
    if (!fp1) { perror(argv[1]); return 1; }

    FILE *fp2 = (argc >= 3) ? fopen(argv[2], "w") : stdout;
    if (!fp2) { perror(argv[2]); fclose(fp1); return 1; }

    int ch;
    while ((ch = fgetc(fp1)) != EOF)
        fputc(ch, fp2);

    fclose(fp1);
    if (fp2 != stdout) fclose(fp2);
    return 0;
}

六、非標準檔案函數(低層 I/O)

UNIX 起源,MS-DOS 3.0+ 支援:open/close/read/write/lseek。使用檔案描述符 int fd,無緩衝,系統呼叫層級。標準庫函數內部封裝此層。一般應用請優先使用標準函數,除非需精確控制同步、鎖定、非阻塞等特性。

結語

標準檔案函數以 FILE* 統一抽象裝置差異,緩衝機制提升效能。掌握「開啟模式選擇、緩衝區刷新時機、三大標準串流、順序讀寫三層級 (字元/字串/格式化)、錯誤檢查模式」即可應對絕大多數檔案 I/O 需求。記住:永遠檢查 fopen 返回值、寫入關鍵資料後 fflush、配對 fopen/fclose。

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