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

C語言文件操作全集:fopen/fread/fwrite/fseek/ftell/rewind 完整 API 詳解與實戰模式

     編輯:關於C語言

1. fopen - 打開文件

FILE *fopen(const char *path, const char *mode);

模式字符串組合規則

由 r/w/a + b/t + + 組合:

模式含義文件須存在指針位置截斷
r只讀是開頭否
w只寫否(不存在創建)開頭是
a追加寫否(不存在創建)結尾否
r+讀寫是開頭否
w+讀寫否開頭是
a+讀寫追加否開頭(讀)/結尾(寫)否

加 b 表示二進制(rb、wb 等),t 表示文本(默認可省略)。

錯誤處理模式

FILE *fp = fopen("data.txt", "r");
if (!fp) {
    perror("fopen failed");
    return -1;
}

2. fread / fwrite - 數據塊讀寫

size_t fread(void *buf, size_t size, size_t count, FILE *fp);
size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp);
  • buf:緩衝區地址
  • size:單個元素字節數
  • count:元素個數
  • 返回值:成功讀寫的元素個數
// 讀取 5 個 float 到數組
float fa[5];
fread(fa, sizeof(float), 5, fp);

// 寫入結構體數組
fwrite(stu_array, sizeof(Student), 100, fp);

3. fgetc / fputc - 字符讀寫

int fgetc(FILE *fp);      // 返回字符或 EOF(-1)
int fputc(int c, FILE *fp); // 返回寫入字符或 EOF

getchar() ≡ fgetc(stdin),putchar(c) ≡ fputc(c, stdout)。

4. fgets / fputs - 字符串讀寫

char *fgets(char *str, int n, FILE *fp);  // 讀 n-1 字符或遇 \n,自動加 \0
int fputs(const char *s, FILE *fp);       // 寫字符串,不自動加 \n

5. fprintf / fscanf - 格式化讀寫

int fprintf(FILE *fp, const char *fmt, ...);
int fscanf(FILE *fp, const char *fmt, ...);

類似 printf/scanf,但針對文件流。

6. 隨機訪問:ftell / fseek / rewind

long ftell(FILE *fp);                    // 返回當前位置偏移(字節)
int fseek(FILE *fp, long offset, int origin); // 移動指針
void rewind(FILE *fp);                   // 重置到開頭 ≡ fseek(fp, 0, SEEK_SET)

origin 取值

常量值含義
SEEK_SET0文件開頭
SEEK_CUR1當前位置
SEEK_END2文件結尾

7. 實戰模式:獲取文件大小

FILE *fp = fopen("data.bin", "rb");
if (!fp) return -1;

fseek(fp, 0, SEEK_END);   // 移至末尾
long size = ftell(fp);    // 獲取位置 = 文件大小
rewind(fp);               // 回到開頭繼續讀取

// 現在可分配精確大小緩衝區讀取整個文件
char *buf = malloc(size + 1);
fread(buf, 1, size, fp);
buf[size] = '\0';

8. 二進制 vs 文本模式關鍵差異

特性文本模式二進制模式
換行符Windows: \r\n ↔ \n 轉換原樣讀寫
EOF 處理Ctrl+Z (0x1A) 視為結束無特殊處理
適用場景文本文件圖片、結構體、任意二進制

最佳實踐清單

  1. 二進制數據必須用 b 模式
  2. 打開後必須檢查返回值
  3. 用完必須 fclose,正常退出會自動關閉但不保證異常時
  4. 隨機讀寫前確認文件支持定位(管道/終端不支持)
  5. 大文件用 fread/fwrite 塊操作,避免逐字符開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved