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

C語言檔案操作完整指南:從類型到實戰

     編輯:關於C

檔案 I/O 系統性整理:類型、指標、操作步驟、模式、函數

全面梳理 C 語言檔案操作核心概念,從資料檔分類到完整操作流程,附圖解與常見陷阱。

一、資料檔案分類

類型儲存形式特點適用場景
文字檔ASCII/UTF-8 字元可讀、可編輯、跨平台設定檔、日誌、資料交換
二進位檔記憶體映像 (位元級)緊湊、快速、結構化資料庫、多媒體、高效能儲存

判別技巧:用記事本開啟,亂碼 = 二進位檔;可讀 = 文字檔。

二、檔案指標

FILE *fp; // 檔案指標變數,指向檔案控制結構體

// 內部包含:檔案描述符、緩衝區指標、位置指標、錯誤旗標、模式旗標...

FILE 為不透明型別,僅透過標準庫函數操作,不可直接存取成員。

三、標準操作流程

  1. 開啟:fp = fopen("path", "mode")
  2. 讀/寫:fgetc/fputc, fgets/fputs, fscanf/fprintf, fread/fwrite
  3. 關閉:fclose(fp) (釋放緩衝區、更新元資料、釋放檔案鎖)

鐵律:每次 fopen 必配對 fclose,否則資源洩漏、資料遺失。

四、開啟模式完整表

模式讀寫建立截斷定位二進位
r✓開頭
w✓✓✓開頭
a✓✓結尾
r+✓✓開頭
w+✓✓✓✓開頭
a+✓✓✓結尾
rb/wb/ab...同上同上同上同上同上✓

五、核心讀寫函數族

層級函數單位適用
字元fgetc/fputc, getc/putc1 byte簡單文字處理
行/字串fgets/fputs字串逐行文字處理
格式化fscanf/fprintf依格式結構化文字
區塊/二進位fread/fwrite位元組結構體、陣列、高效能
隨機存取fseek/ftell/rewind位元組偏移資料庫、索引檔

六、字元讀寫範例

寫入字串 (fputc 迴圈)

const char *str = "Hello";
for (int i = 0; str[i]; i++) {
    fputc(str[i], fp);
}

讀取並顯示 (fgetc 迴圈)

int ch;
while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
}
// 注意:ch 必須是 int,不可用 char

七、實戰範例:結構體二進位讀寫

#include <stdio.h>
#include <string.h>

typedef struct {
    int id;
    char name[32];
    float score;
} Student;

void writeStudents(const char *path, Student *arr, int n) {
    FILE *fp = fopen(path, "wb");
    if (!fp) return;
    fwrite(arr, sizeof(Student), n, fp);
    fclose(fp);
}

void readStudents(const char *path) {
    FILE *fp = fopen(path, "rb");
    if (!fp) return;
    Student s;
    while (fread(&s, sizeof(Student), 1, fp) == 1) {
        printf("ID:%d Name:%s Score:%.1f\n", s.id, s.name, s.score);
    }
    fclose(fp);
}

八、常見陷阱與最佳實務

  • 文字/二進位模式:Windows \r\n ↔ \n 轉換只在文字模式發生
  • 結構體記憶體對齊:不同編譯器/平台 padding 不同,跨平台二進位檔需手動序列化
  • 緩衝區刷新:fflush(fp) 強制寫入磁碟,關鍵日誌必須呼叫
  • 錯誤檢查:ferror(fp) 檢測讀寫錯誤,feof(fp) 檢測檔案結尾
  • 大檔案支援:使用 fseeko/ftello (off_t) 或 _fseeki64 處理 >2GB 檔案
  • 臨時檔案:tmpfile() 自動建立/刪除,安全無殘留
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved