| 參數 | 說明 |
| str | 目標字符數組(需預留空間) |
| n | 最大讀取字符數(含結束符 \0),實際最多讀 n-1 字符 |
| fp | 文件指針 |
關鍵行為
- 讀取到
n-1 字符、遇到換行符、或文件結尾 時停止
- 換行符 會被讀取並保存 在字符串中(區別於
gets)
- 末尾自動添加
\0
- 成功返回
str,失敗/EOF 返回 NULL
fputs - 寫入字符串
int fputs(const char *str, FILE *fp);
- 將字符串
str 寫入文件 fp
- 不自動添加換行符,需手動在字符串末尾加
\n
- 成功返回非負數,失敗返回
EOF
實戰示例 1:逐行讀取文件顯示
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main() {
FILE *fp;
char str[N + 1]; // +1 留給 \0
if ((fp = fopen("d:\\demo.txt", "rt")) == NULL) {
printf("Cannot open file!\n");
return 1;
}
while (fgets(str, N, fp) != NULL) {
printf("%s", str); // str 已含換行,無需額外 \n
}
fclose(fp);
return 0;
}
若 demo.txt 內容為:
C語言中文網
https://c.biancheng.net
一個學習編程的好網站!
輸出將完全一致,因 fgets 保留了換行符。
實戰示例 2:向文件追加一行
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
char str[102] = {0}, input[100];
// "at+" 追加文本讀寫,文件不存在則創建
if ((fp = fopen("D:\\demo.txt", "at+")) == NULL) {
printf("Cannot open file!\n");
return 1;
}
printf("請輸入要追加的字符串:");
gets(input); // 注意:gets 不安全,教學演示用;實際請用 fgets
strcat(str, "\n"); // 手動加換行
strcat(str, input); // 拼接用戶輸入
fputs(str, fp); // 寫入文件
fclose(fp);
return 0;
}
fgets vs gets vs scanf 對比
| 函數 | 讀取範圍 | 空格處理 | 換行符 | 安全性 |
| fgets | 最多一行 | 包含空格 | 保留 \n | 安全(可限制長度) |
| gets | 整行 | 包含空格 | 丟棄 \n | 危險(無長度限制,已棄用) |
| scanf(%s) | 單詞 | 遇空格停止 | 不讀取 | 安全但功能受限 |
常見問題與最佳實踐
- 緩衝區大小:
n 設為緩衝區大小,確保不溢出;長行可循環讀取拼接
- 去除換行符:若不需要 \n,可用
str[strcspn(str, "\n")] = '\0' 移除
- 文本 vs 二進制模式:文本模式 "rt"/"at+" 自動處理換行轉換,推薦文本文件用文本模式
- 替代方案:C11
fgets_s、POSIX getline(自動擴容)更安全便捷
- 上一篇文章: C語言數據塊文件讀寫:fread 與 fwrite 完整指南
- 下一篇文章: C語言字符流文件讀寫詳解:fgetc 與 fputc 完全指南
Copyright ©
程式碼之家 All Rights Reserved