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

C語言字符串文件讀寫:fgets 與 fputs 完整指南

     編輯:C 語言基礎

為什麼需要字符串級讀寫?

字符級 fgetc/fputc 效率低(頻繁系統調用),塊級 fread/fwrite 處理文本不便。fgets/fputs 以行為單位操作,是處理文本文件最常用、最高效的方式。

fgets - 讀取一行字符串

char *fgets(char *str, int n, FILE *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 對比

參數說明
str目標字符數組(需預留空間)
n最大讀取字符數(含結束符 \0),實際最多讀 n-1 字符
fp文件指針
函數讀取範圍空格處理換行符安全性
fgets最多一行包含空格保留 \n安全(可限制長度)
gets整行包含空格丟棄 \n危險(無長度限制,已棄用)
scanf(%s)單詞遇空格停止不讀取安全但功能受限

常見問題與最佳實踐

  • 緩衝區大小:n 設為緩衝區大小,確保不溢出;長行可循環讀取拼接
  • 去除換行符:若不需要 \n,可用 str[strcspn(str, "\n")] = '\0' 移除
  • 文本 vs 二進制模式:文本模式 "rt"/"at+" 自動處理換行轉換,推薦文本文件用文本模式
  • 替代方案:C11 fgets_s、POSIX getline(自動擴容)更安全便捷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved