`fgets` 與 `fputs` 是 C 標準庫處理檔案字串讀寫的核心函數,比 `fscanf`/`fprintf` 更適合整行處理。本文詳細說明函數原型、參數含義、回傳值、邊界行為,並提供完整範例程式碼。
char *fgets(char *str, int n, FILE *stream);
str:目標字元陣列,需預留足夠空間。n:最大讀取字元數 包含結束符,實際最多讀取 n-1 個字元。stream:輸入檔案指標。n-1 字元、遇到換行符 `\n`、或 EOF 時停止。\n 會被保留在字串中,後接 `\0`。str(首位址),失敗或 EOF 回傳 NULL。#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;
}
int fputs(const char *str, FILE *stream);
str:要寫入的字串(常值、陣列或指標),不自動加換行符。stream:輸出檔案指標。#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) |
掌握 `fgets`(讀取上限 `n-1`、保留換行、EOF 行為)與 `fputs`(不加換行、需自行管理換行)的精確語意,配合回傳值檢查,即能安全高效處理檔案字串 I/O。