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

C語言標準 I/O 全解析:緩衝機制、文件操作與二進制讀寫實戰

     編輯:關於C

一、三種緩衝模式

模式觸發條件典型場景控制函數
全緩衝緩衝區滿磁盤文件fflush() 強制刷新
行緩衝遇到換行符終端設備setvbuf() 設置
無緩衝每次調用即寫入stderr 標準錯誤無需控制

二、文件打開模式詳解


FILE *fopen(const char *filename, const char *mode);
mode含義文件須存在截斷文件可讀可寫
r只讀是否否
w只寫(新建)否是否
a追加寫否否否
r+讀寫是否是
w+讀寫(新建)否是是
a+追加讀寫否否是

關鍵規則:帶 + 的模式切換讀寫時,必須插入 fflush、fseek、fsetpos 或 rewind。

三、二進制 I/O 函數


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);
  • 返回值:成功讀寫的對象個數(非字節數)
  • 適用:結構體、數組等數據塊整體讀寫
  • 限制:跨平台移植性差(字節序、對齊、浮點格式)

四、隨機訪問核心函數


long ftell(FILE *fp);           // 獲取當前位置(相對文件頭字節數)
int fseek(FILE *fp, long offset, int origin);  // 移動位置指針
int rewind(FILE *fp);           // 等價 fseek(fp, 0, SEEK_SET)
origin 常量值含義
SEEK_SET0文件開頭
SEEK_CUR1當前位置
SEEK_END2文件末尾

五、獲取文件大小標準範式


FILE *fs = fopen("C:\\1.txt", "r");
long length = 0;

fseek(fs, 0, SEEK_END);   // 定位到末尾
length = ftell(fs);       // 位置即為大小
rewind(fs);               // 重置到開頭繼續讀寫

六、常見坑點避雷

  1. 文本 vs 二進制:Windows 下 "r" 會將 \r\n 轉為 \n,二進制模式需加 b(如 "rb")
  2. 異常終止:進程異常退出不保證緩衝區刷新,關鍵數據需及時 fflush
  3. fread/fwrite 返回值:檢查返回值是否等於 count,而非簡單判斷非零
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved