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

C 語言 fgets 與 fputs 函數完整使用指南

     編輯:關於C語言

前言

`fgets` 與 `fputs` 是 C 標準庫處理檔案字串讀寫的核心函數,比 `fscanf`/`fprintf` 更適合整行處理。本文詳細說明函數原型、參數含義、回傳值、邊界行為,並提供完整範例程式碼。

一、fgets — 從檔案讀取字串

函數原型

char *fgets(char *str, int n, FILE *stream);

參數說明

  • str:目標字元陣列,需預留足夠空間。
  • n:最大讀取字元數 包含結束符,實際最多讀取 n-1 個字元。
  • stream:輸入檔案指標。

行為細節

  1. 讀取至 n-1 字元、遇到換行符 `\n`、或 EOF 時停止。
  2. 若讀到換行符,\n 會被保留在字串中,後接 `\0`。
  3. 回傳值:成功回傳 str(首位址),失敗或 EOF 回傳 NULL。

範例:讀取檔案前 10 字元

#include 
#include 

int main() {
    FILE *fp = fopen("e10_1.c", "rt");
    if (!fp) { perror("Cannot open file"); exit(1); }
    char str[11]; /* 10 字元 + \0 */
    fgets(str, 11, fp);
    printf("%s", str);
    fclose(fp);
    return 0;
}

二、fputs — 向檔案寫入字串

函數原型

int fputs(const char *str, FILE *stream);

參數說明

  • str:要寫入的字串(常值、陣列或指標),不自動加換行符。
  • stream:輸出檔案指標。

回傳值

成功回傳非負值,失敗回傳 `EOF`。

範例:以附加模式寫入字串並顯示全檔內容

#include 
#include 

int main() {
    FILE *fp = fopen("string", "at+");
    if (!fp) { perror("Cannot open file"); exit(1); }
    char st[20];
    printf("input a string: ");
    scanf("%19s", st); /* 防止緩衝區溢位 */
    fputs(st, fp);
    rewind(fp); /* 移回檔案開頭 */
    int ch;
    while ((ch = fgetc(fp)) != EOF) putchar(ch);
    printf("\n");
    fclose(fp);
    return 0;
}

三、常見誤區與最佳實踐

誤區正確做法
用 `fgets` 讀取後直接 `printf("%s", str)` 導致雙重換行`fgets` 保留 `\n`,`printf` 不加 `\n` 或手動移除尾部 `\n`
`fputs` 寫入後預期自動換行需自行在字串末尾加 `\n` 或呼叫 `fputc('\n', fp)`
忽略回傳值檢查必須檢查 `fgets` 是否為 `NULL`,`fputs` 是否為 `EOF`
緩衝區大小不足導致截斷陣列大小至少 `n`,建議動態配置或使用 `getline` (POSIX)

四、補充:與 gets/puts 的比較

  • `gets`:已棄用 (C11 移除),無長度限制,極易緩衝區溢位。
  • `puts`:自動加 `\n`,僅能寫入 stdout。
  • `fgets`/`fputs`:指定緩衝區大小、可操作任意檔案流,安全且可移植。

五、總結

掌握 `fgets`(讀取上限 `n-1`、保留換行、EOF 行為)與 `fputs`(不加換行、需自行管理換行)的精確語意,配合回傳值檢查,即能安全高效處理檔案字串 I/O。

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