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

C語言檔案操作完全指南:型別、緩衝、開啟模式與核心函式

     編輯:關於C

一、檔案型別分類

  • 串流檔案:標準輸入/輸出、磁碟檔案,以位元組串流方式存取。
  • 裝置檔案:作業系統將硬體裝置(VGA、序列埠、USB、網卡)抽象為檔案,透過檔案操作介面存取硬體。

二、三個預設開啟的標準串流

串流裝置對應函式
stdin鍵盤scanf, gets, fgetc
stdout螢幕printf, puts, fputc
stderr螢幕perror, fprintf(stderr,...)

三、輸出緩衝區刷新機制

標準輸出預設為行緩衝(遇 \n 刷新),導向檔案時變為全緩衝(滿 8192 bytes 才刷新)。四種強制刷新方式:

  1. 輸出 \n(行緩衝模式下)
  2. 程式正常結束(return 0 或 exit(0))
  3. 呼叫 fflush(stdout)
  4. 緩衝區寫滿自動刷新
printf("hello");        // 無 \n,可能不顯示
printf("hello\n");      // 有 \n,立即顯示
fflush(stdout);         // 手動刷新
while(1);               // 程式不結束,緩衝區不刷新

四、FILE 結構體本質

FILE 是 typedef 定義的結構體,包含檔案描述符、緩衝區指標、讀寫位置、錯誤/EOF 標誌等。fopen 回傳 FILE*,失敗回傳 NULL。

五、fopen 開啟模式完整表

模式說明檔案不存在檔案存在讀寫位置
r唯讀失敗保留開頭
w唯寫建立截斷(清空)開頭
a附加寫入建立保留結尾
r+讀寫失敗保留開頭
w+讀寫建立截斷開頭
a+讀寫附加建立保留結尾

二進制模式在模式字串後加 b(如 rb, wb),Windows 下區分換行符處理,Linux/Unix 無差異。

六、核心檔案操作函式

1. 逐行讀寫:fgets / fputs

char buf[1024];
FILE* fp = fopen("test.txt", "r");
while (fgets(buf, sizeof(buf), fp)) {
    printf("%s", buf); // fgets 保留 \n
}
fclose(fp);

2. 逐字元讀寫:fgetc / fputc

int ch;
while ((ch = fgetc(fp)) != EOF) {
    fputc(ch, stdout);
}

3. 區塊二進制讀寫:fread / fwrite

// 讀取 10 筆結構體
struct Data { int id; float val; } arr[10];
fread(arr, sizeof(struct Data), 10, fp);

// 寫入陣列
fwrite(arr, sizeof(struct Data), 10, fp);
  • 回傳值:實際讀寫的項目數(非位元組數)。
  • 適合結構體、陣列等二進制資料,不受文本格式影響。

4. 緩衝區控制:fflush

fflush(fp); // 強制將輸出緩衝區寫入裝置

5. 檔案定位:fseek / rewind / ftell

fseek(fp, 0, SEEK_SET); // 移至開頭
fseek(fp, 0, SEEK_END); // 移至結尾
long pos = ftell(fp);   // 取得目前位置
rewind(fp);             // 等同 fseek(fp, 0, SEEK_SET)
  • fseek 偏移量過大可擴展檔案(實際寫入時才分配磁碟空間)。

6. 狀態檢查:feof / ferror

while (!feof(fp)) { ... } // 注意:feof 在讀取失敗後才為真

七、檔案複製完整範例

void copy_file(const char* src, const char* dst) {
    FILE *fs = fopen(src, "rb"), *fd = fopen(dst, "wb");
    if (!fs || !fd) { perror("open failed"); return; }

    char buf[4096];
    size_t n;
    while ((n = fread(buf, 1, sizeof(buf), fs)) > 0) {
        fwrite(buf, 1, n, fd);
    }
    fclose(fs); fclose(fd);
}

八、系統限制與注意事項

  • 單一進程預設最大開啟檔案數:1024(可用 ulimit -n 調整)。
  • fclose 內部會呼叫 fflush,確保資料寫入。
  • 二進制模式下 \n 不做轉換,跨平台較安全。
  • 避免使用 gets(無緩衝區長度檢查),改用 fgets。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved