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

C語言字符流文件讀寫詳解:fgetc 與 fputc 完全指南

     編輯:C 語言基礎

前言

在 C 語言中,文件操作極具彈性:既可逐字符讀寫,也可按字符串或任意字節塊處理。本文深入講解以字符形式讀寫文件的核心函數 fgetc() 與 fputc(),並通過完整示例演示如何安全、高效地處理文本文件。

字符讀取函數 fgetc

fgetc 是 file get char 的縮寫,用於從指定文件流讀取單個字符。其原型為:

int fgetc(FILE *fp);

fp 為文件指針。讀取成功時返回該字符(以 int 型態返回),讀到文件末尾或發生錯誤時返回 EOF(通常為 -1,但標準僅保證為負值)。返回類型用 int 而非 char,正是為了容納 EOF 這個負數標記。

提示: EOF 並不絕對等於 -1,具體值取決於編譯器實現,請始終使用符號常量而非硬編碼數值。

文件內部位置指針

每個打開的文件流內部都維護一個位置指針,指向下一次讀寫的字節偏移量。文件剛打開時指向首字節;每次呼叫 fgetc() 後,指針自動後移一字節。此指針由系統自動管理,對程式設計師透明,不等同於 C 語言中的指標變數。

示例:逐字符顯示文件內容

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *fp;
    int ch;                 // 必須用 int 接收返回值,以便判斷 EOF

    if ((fp = fopen("D:\\demo.txt", "rt")) == NULL) {
        printf("Cannot open file, press any key to exit!");
        getchar();
        exit(EXIT_FAILURE);
    }

    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }
    putchar('\n');

    fclose(fp);
    return 0;
}

執行前請在 D 盤建立 demo.txt 並寫入任意文字,程式將逐字讀取並輸出到螢幕。

關於 EOF 的進一步說明

EOF 既可能表示正常讀完,也可能表示讀取出錯。為區分兩者,可使用 feof() 與 ferror():

  • feof(fp):若位置指針已到文件末尾,返回非零值。
  • ferror(fp):若文件操作發生錯誤,返回非零值。

雖然純讀取場景下 while ((ch = fgetc(fp)) != EOF) 通常足夠,但在嚴謹專案中建議額外檢查:

if (ferror(fp)) {
    puts("讀取出錯");
} else {
    puts("讀取成功");
}

字符寫入函數 fputc

fputc 全稱 file put char,向文件流寫入單字符。原型:

int fputc(int ch, FILE *fp);

成功返回寫入的字符,失敗返回 EOF。示例:

fputc('a', fp);           // 直接寫字面量
char c = 'b';
fputc(c, fp);             // 或寫變數

兩點關鍵說明

  1. 文件打開模式影響內容保留:以 "w" 或 "w+" 打開既有文件會清空原內容;若需保留並追加,請用 "a" 或 "a+"。文件不存在時均會自動建立。
  2. 位置指針同步移動:每寫入一字符,內部位置指針後移一字節。

示例:從鍵盤讀入一行並存檔

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *fp;
    int ch;

    if ((fp = fopen("D:\\demo.txt", "wt+")) == NULL) {
        printf("Cannot open file, press any key to exit!\n");
        getchar();
        exit(EXIT_FAILURE);
    }

    printf("Input a string:\n");
    while ((ch = getchar()) != '\n') {
        fputc(ch, fp);
    }

    fclose(fp);
    return 0;
}

程式讀取鍵盤輸入直到換行鍵,將每字符寫入文件。打開 demo.txt 即可看到剛輸入的內容。

總結

  • fgetc/fputc 是字符級文件 I/O 的基石,適合處理文本文件、逐字符解析等場景。
  • 務必用 int 變數接收返回值,正確判斷 EOF。
  • 善用 feof/ferror 提升程式健壯性。
  • 文件打開模式決定內容是否保留,請根據業務需求選擇 w/a 等模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved