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

C 語言文件操作(十二):feof/rewind 判斷文件結束、非標準 I/O open/close 詳解

     編輯:關於C語言

前言

文件操作是持久化數據的關鍵。本文聚焦兩大主題:標準庫中**文件結束判斷**的正確姿勢(feof/rewind),以及 UNIX 遺產、**DOS 3.0+ 支援**的非標準底層 I/O 函數族(open/close/read/write 等),頭文件 io.h。

一、標準庫:文件結束與位置控制

1. feof:判斷文件結束的標準方式

int feof(FILE *stream);
  • 返回非 0:文件位置指示器已到達 EOF。
  • 返回 0:未到達。
  • 必要性:二進制文件中 EOF (-1) 可能是合法數據位模式,單純檢查 fgetc() == EOF 會誤判。feof 區分「讀到 EOF 值」與「真正結束」。

標準讀取循環模式:

while (!feof(fp)) {
    int ch = fgetc(fp);
    if (feof(fp)) break;  // 雙重保險
    process(ch);
}

2. rewind:歸零文件位置指示器

int rewind(FILE *stream);
  • 將位置指示器移至文件開頭(等價 fseek(fp, 0, SEEK_SET) 但清除錯誤標誌)。
  • 成功返回 0,失敗返回非 0。
  • 常用於「讀寫切換前歸零」、「多次讀取同一文件」。

二、非標準 I/O:底層文件描述符操作

源自 UNIX System V,io.h,DOS 3.0+ 支援。不經 FILE* 緩衝層,直接調用作業系統服務,適用於系統編程、高性能、特殊設備控制。

1. open:打開文件獲取描述符

int open(char *filename, int access);
  • 返回 **文件描述符 (fd)**:非負整數,作為後續操作句柄。失敗返回 -1。
  • access = **基本模式** | **修飾符**(按位或 | 組合)。

2. access 參數完整對照表

類別常數含義
基本模式 (三選一)O_RDONLY只讀
O_WRONLY只寫
O_RDWR讀寫
修飾符 (可多選)O_APPEND每次寫入前定位至文件末尾
O_CREAT文件不存在則創建(屬性依基本模式)
O_TRUNC文件存在則截斷長度為 0(屬性不變)
O_BINARY二進制模式 (無轉換)
O_TEXT文本模式 (換行符轉換)

3. 組合範例

/* 讀寫二進制,不存在則創建,存在則截斷 */
int fd = open("data.bin", O_RDWR | O_BINARY | O_CREAT | O_TRUNC);

/* 只讀文本,追加寫入 */
int fd = open("log.txt", O_WRONLY | O_TEXT | O_APPEND);

4. close:關閉描述符

int close(int fd);
  • 釋放 fd,刷新系統緩衝區。成功返回 0,失敗 -1。

三、非標準 I/O 核心函數族速覽

函數原型功能
readint read(int fd, void *buf, unsigned n)從 fd 讀最多 n 位元組到 buf,返回實際讀取位元組數
writeint write(int fd, const void *buf, unsigned n)向 fd 寫 buf 前 n 位元組,返回實際寫入位元組數
lseeklong lseek(int fd, long offset, int origin)移動 fd 位置指示器,origin: 0=SET, 1=CUR, 2=END
telllong tell(int fd)返回 fd 當前位置偏移量
eofint eof(int fd)檢查 fd 是否到達文件末尾

四、標準 vs 非標準 選擇指南

維度標準 I/O (FILE*)非標準 I/O (fd)
可移植性ANSI C / ISO C 保證POSIX / UNIX / DOS 特定
緩衝用戶態全缓冲/行緩衝/無緩衝無用戶態緩衝,直達內核
格式化fprintf/fscanf 豐富無,僅原始位元組
錯誤處理ferror/feof/perror返回值 + errno
適用場景應用層文本/二進制文件系統編程、設備驅動、高吞吐、內存映射前置

五、實戰建議

  1. 應用層首選標準 I/O(fopen/fread/fwrite/fclose),可移植、功能豐富。
  2. 需精確控制文件位置、避免緩衝區拷貝、或操作設備文件時,使用非標準 I/O。
  3. 混用時注意:**同一文件勿同時用兩套 API**,緩衝區不一致導致數據錯亂。
  4. 現代跨平台代碼建議封裝抽象層,底層對接 open/read/write (POSIX) 或 CreateFile/ReadFile/WriteFile (Win32)。

總結

feof 解決二進制文件 EOF 判斷歧義,rewind 提供便捷歸零。非標準 I/O 以文件描述符為核心,access 位掩碼組合靈活強大,是系統級編程的利器。理解兩套體系的邊界與轉換,是從應用程序員進階為系統程序員的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved