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

C 標準庫文件操作函數大全:fopen/fread/fwrite/fseek/ftell 等完整參考

     編輯:關於C語言

文件操作核心流程

  1. fopen 打開 → 返回 FILE*
  2. fread/fwrite/fgetc/fputc/fgets/fputs 讀寫
  3. fseek/ftell/rewind 定位
  4. fclose 關閉,刷新緩衝區、釋放資源

函數速查表

函數原型說明返回值
fopenFILE* fopen(const char* path, const char* mode)打開文件。mode: r/w/a/r+/w+/a+ 可加 b(二進制)成功: FILE*;失敗: NULL
fcloseint fclose(FILE* stream)關閉文件,刷新緩衝區成功: 0;失敗: EOF
freadsize_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream)讀取 nmemb 個 size 字節元素實際讀取元素數
fwritesize_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream)寫入 nmemb 個 size 字節元素實際寫入元素數
fseekint fseek(FILE* stream, long offset, int whence)移動文件指針。whence: SEEK_SET/CUR/END成功: 0;失敗: -1
ftelllong ftell(FILE* stream)獲取當前文件指針位置位置(字節偏移);錯誤: -1
rewindvoid rewind(FILE* stream)指針歸零,清除錯誤標誌無
fgetcint fgetc(FILE* stream)讀取一字符字符值;EOF
fputcint fputc(int c, FILE* stream)寫入一字符寫入字符;EOF
fgetschar* fgets(char* s, int size, FILE* stream)讀取一行(含換行符),最多 size-1 字符s;EOF/錯誤: NULL
fputsint fputs(const char* s, FILE* stream)寫入字符串(不含結束符)非負數;EOF
feofint feof(FILE* stream)檢測文件結束標誌非零: 已到末尾
ferrorint ferror(FILE* stream)檢測錯誤標誌非零: 有錯誤
clearerrvoid clearerr(FILE* stream)清除錯誤和EOF標誌無
fflushint fflush(FILE* stream)刷新輸出緩衝區成功: 0;失敗: EOF
setbufvoid setbuf(FILE* stream, char* buf)設置緩衝區。buf=NULL → 無緩衝無
setvbufint setvbuf(FILE* stream, char* buf, int mode, size_t size)精確控制緩衝。mode: _IOFBF/_IOLBF/_IONBF成功: 0;失敗: 非零
ftello/fseekooff_t ftello(FILE*) / int fseeko(FILE*, off_t, int)大文件支持 (LFS),off_t 為 64位同 ftell/fseek
filenoint fileno(FILE* stream)獲取底層文件描述符fd;錯誤: -1
fdopenFILE* fdopen(int fd, const char* mode)文件描述符轉 FILE*FILE*;NULL
freopenFILE* freopen(const char* path, const char* mode, FILE* stream)重新關聯流到新文件FILE*;NULL
tmpfileFILE* tmpfile(void)創建臨時二進制文件,關閉自動刪除FILE*;NULL
tmpnamchar* tmpnam(char* s)生成唯一臨時文件名指向名稱緩衝區
removeint remove(const char* path)刪除文件成功: 0
renameint rename(const char* old, const char* new)重命名/移動文件成功: 0

關鍵模式字符串

mode含義文件須存在寫入位置
r只讀是-
w只寫,截斷/創建否開頭
a追加寫入否末尾
r+讀寫是開頭
w+讀寫,截斷/創建否開頭
a+讀寫,追加否末尾

加 b 表示二進制模式 (Windows 關鍵,Linux 忽略)。

經典讀寫模式

文本逐行讀取


FILE *fp = fopen("data.txt", "r");
char line[256];
while (fgets(line, sizeof(line), fp)) {
    // 處理 line (含 \n)
}
fclose(fp);

二進制結構體數組讀寫


struct Record { char name[20]; int id; };
struct Record recs[100];

// 寫入
FILE *fp = fopen("data.bin", "wb");
fwrite(recs, sizeof(struct Record), 100, fp);
fclose(fp);

// 讀取
fp = fopen("data.bin", "rb");
size_t cnt = fread(recs, sizeof(struct Record), 100, fp);
fclose(fp);

隨機訪問:修改第 5 條記錄


fp = fopen("data.bin", "r+b");
fseek(fp, 4 * sizeof(struct Record), SEEK_SET);
fwrite(&new_rec, sizeof(struct Record), 1, fp);
fclose(fp);

錯誤處理模式


FILE *fp = fopen("file.txt", "r");
if (!fp) {
    perror("fopen failed"); // 打印 errno 對應信息
    return -1;
}
// ... 操作 ...
if (ferror(fp)) {
    fprintf(stderr, "I/O error\n");
}
fclose(fp);

緩衝區模式選擇

  • _IOFBF (全緩衝):填滿刷新,適合大文件順序讀寫
  • _IOLBF (行緩衝):遇換行刷新,適合終端交互
  • _IONBF (無緩衝):立即寫入,調試/日志/關鍵數據

大文件支持 (LFS)

  • 編譯加 -D_FILE_OFFSET_BITS=64
  • 使用 ftello/fseeko、off_t 替代 long
  • 支持 >2GB 文件操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved