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

C語言 FILE* 指標詳解:結構體內容、標準串流與檔案操作流程

     編輯:C 語言問答

定義


FILE *fp;

FILE 是標準庫定義的**不透明結構體** (opaque type),具體成員由實作定義 (glibc/MSVC/UCRT 各不同)。
fp 是指向該結構體的指標,稱作**檔案串流指標** 或 **檔案控制塊指標**。

核心成員概念 (以 glibc 為例)


struct _IO_FILE {
    int _flags;           // 模式標誌: _IO_READ, _IO_WRITE, _IO_APPEND...
    char *_IO_read_ptr;   // 讀緩衝區當前指標
    char *_IO_read_end;   // 讀緩衝區結尾
    char *_IO_read_base;  // 讀緩衝區基址
    char *_IO_write_base; // 寫緩衝區基址
    char *_IO_write_ptr;  // 寫緩衝區當前指標
    char *_IO_write_end;  // 寫緩衝區結尾
    char *_IO_buf_base;   // 緩衝區基址
    char *_IO_buf_end;    // 緩衝區結尾
    int _fileno;          // 檔案描述符 (Linux fd / Windows handle)
    // ... 鎖、跳轉表、寬字元支援等
};

三個預設開啟的標準串流

完整檔案操作生命週期


// 1. 開啟
FILE *fp = fopen("data.txt", "r"); // 失敗回傳 NULL,設 errno
if (!fp) { perror("fopen"); return -1; }

// 2. 讀寫 (緩衝區自動管理)
char buf[100];
while (fgets(buf, sizeof(buf), fp)) { /* 處理 */ }
fprintf(fp, "新行\n"); // 寫入

// 3. 定位
fseek(fp, 0, SEEK_SET); // 回開頭
long pos = ftell(fp);   // 目前位置

// 4. 關閉 (必須!刷新緩衝區、釋放資源、更新檔案大小)
if (fclose(fp) != 0) { perror("fclose"); }

// 5. 錯誤/結尾檢查
if (ferror(fp)) { /* 讀寫錯誤 */ }
if (feof(fp)) { /* 檔案結尾 */ }

常見錯誤

  • 用 FILE fp; (非指標) → 型別不匹配,fopen 回傳指標無法賦值。
  • 忘記 fclose → 緩衝區未刷新、資源洩漏、檔案鎖定。
  • 重複 fclose / 使用已關閉 fp → 未定義行為。
  • fopen("file", "r") 讀取不存在檔案 → 回傳 NULL,**必須檢查**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
巨集檔案描述符用途典型裝置
stdin0標準輸入鍵盤
stdout1標準輸出螢幕
stderr2標準錯誤螢幕 (無緩衝/行緩衝)