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

C 語言文件操作完整指南:模式、函數族與實戰範例

     編輯:關於C語言

一、文件指標與打開模式

C 語言透過 FILE * 指標操作文件。fopen() 返回文件指標,失敗返回 NULL。

12 種打開模式速查表

模式含義
rt唯讀開啟文字檔,不存在報錯
wt唯寫開啟/建立文字檔,截斷為零長度
at追加開啟/建立文字檔,寫入位置在檔尾
rb唯讀開啟二進制檔
wb唯寫開啟/建立二進制檔,截斷
ab追加開啟/建立二進制檔
rt+讀寫開啟文字檔,不存在報錯
wt+讀寫開啟/建立文字檔,截斷
at+讀寫開啟文字檔,讀從頭,寫在尾
rb+讀寫開啟二進制檔
wb+讀寫開啟/建立二進制檔,截斷
ab+讀寫開啟二進制檔,讀從頭,寫在尾

二、四大核心讀寫函數族

類別讀取寫入適用場景
字元fgetc()fputc()逐字元處理,簡單文本
格式化fscanf()fprintf()結構化數據(整數、浮點、字串)
二進制區塊fread()fwrite()結構體、陣列、高效大量數據
字串/行fgets()fputs()逐行讀寫文本文件

三、關閉文件

fclose(fp):刷新緩衝區、釋放資源、置指標無效。必須成對調用。

四、實戰範例:字元級讀寫與效能測試

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

#define NUM 99999

FILE *fp;
char buf[NUM];

// 開啟/建立文件:mode=1寫文本, 2讀文本, 3寫二進制, 4讀二進制
void build(int mode) {
    const char *fname = (mode <= 2) ? "d:/1234.txt" : "d:/1234";
    const char *fmode[] = { "", "w", "r", "wb", "rb" };
    if ((fp = fopen(fname, fmode[mode])) == NULL) {
        printf("open file error\n"); getchar(); exit(1);
    }
}

void close_file() { fclose(fp); }

// 生成測試數據並寫入
void write_test() {
    for (int i = 0; i < NUM; i++) buf[i] = 'a' + (i % 26);
    clock_t start = clock();
    for (int i = 0; i < NUM; i++) fputc(buf[i], fp);
    printf("fputc 寫入耗時: %.3f 秒\n", (double)(clock() - start) / CLOCKS_PER_SEC);
}

// 讀取並計時
void read_test() {
    int ch; clock_t start = clock();
    while ((ch = fgetc(fp)) != EOF);
    printf("fgetc 讀取耗時: %.3f 秒\n", (double)(clock() - start) / CLOCKS_PER_SEC);
}

int main() {
    // 1. 寫入文本測試
    build(1); write_test(); close_file();
    // 2. 讀取文本測試
    build(2); read_test(); close_file();
    // 3. 寫入二進制測試
    build(3); write_test(); close_file();
    // 4. 讀取二進制測試
    build(4); read_test(); close_file();
    return 0;
}

五、常見陷阱與最佳實踐

  • 二進制 vs 文本:Windows 下文本模式會轉換 \n ⇄ \r\n,二進制模式不轉換。跨平台處理二進制數據必須用 b 模式。
  • 緩衝區刷新:fflush(fp) 強制寫入磁碟;fclose 會自動刷新。
  • 錯誤檢查:每次 fopen、fread/fwrite 後檢查返回值,ferror(fp) 判斷錯誤,feof(fp) 判斷檔尾。
  • 定位操作:fseek(fp, offset, SEEK_SET/CUR/END)、ftell(fp)、rewind(fp)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved