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

C語言格式化文件讀寫:fprintf 與 fscanf 完整指南

     編輯:C 語言基礎

什麼是格式化文件讀寫?

fprintf 和 fscanf 是 printf/scanf 的文件版本,功能相同但輸出/輸入目標為磁盤文件而非屏幕/鍵盤。生成的文件可讀性強,適合配置文件、日誌、數據交換。

函數原型

int fprintf(FILE *fp, const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
  • fp:文件指針
  • format:格式控制字符串(與 printf/scanf 完全一致)
  • 返回值:fprintf 返回寫入字符數,失敗返回負數;fscanf 返回成功賦值的參數個數,EOF 表示讀取失敗

完整實戰示例:學生信息存取

#include <stdio.h>

#define N 2

struct Student {
    char name[10];
    int num;
    int age;
    float score;
};

int main() {
    struct Student writeStu[N], readStu[N];
    FILE *fp;
    int i;
    
    // 以文本讀寫方式打開
    if ((fp = fopen("D:\\demo.txt", "wt+")) == NULL) {
        printf("Cannot open file!\n");
        return 1;
    }
    
    printf("請輸入 %d 位學生信息(姓名 學號 年齡 成績):\n", N);
    for (i = 0; i < N; i++) {
        scanf("%s %d %d %f", writeStu[i].name, &writeStu[i].num, 
              &writeStu[i].age, &writeStu[i].score);
    }
    
    // 寫入文件(每行一條記錄,換行分隔)
    for (i = 0; i < N; i++) {
        fprintf(fp, "%s %d %d %f\n", writeStu[i].name, writeStu[i].num,
                writeStu[i].age, writeStu[i].score);
    }
    
    // 重置文件指針到開頭
    rewind(fp);
    
    // 從文件讀取
    for (i = 0; i < N; i++) {
        fscanf(fp, "%s %d %d %f\n", readStu[i].name, &readStu[i].num,
               &readStu[i].age, &readStu[i].score);
    }
    
    // 顯示讀取結果
    printf("\n從文件讀取的數據:\n");
    for (i = 0; i < N; i++) {
        printf("%s %d %d %.2f\n", readStu[i].name, readStu[i].num,
               readStu[i].age, readStu[i].score);
    }
    
    fclose(fp);
    return 0;
}

運行結果

請輸入 2 位學生信息:
Tom 2 15 90.5
Hua 1 14 99
從文件讀取的數據:
Tom 2 15 90.50
Hua 1 14 99.00

文件內容(可直接用記事本查看/編輯)

Tom 2 15 90.500000
Hua 1 14 99.000000

特殊用法:標準流重定向

stdin(標準輸入)、stdout(標準輸出)、stderr(標準錯誤)本質上也是 FILE*,可直接用於 fscanf/fprintf:

#include <stdio.h>

int main() {
    int a, b, sum;
    fprintf(stdout, "請輸入兩個整數:");
    fscanf(stdin, "%d %d", &a, &b);
    sum = a + b;
    fprintf(stdout, "和 = %d\n", sum);
    return 0;
}

此程序行為與 printf/scanf 完全一致,但展示了統一 IO 模型的靈活性。

fprintf/fscanf vs fwrite/fread 對比

特性fprintf/fscanffwrite/fread
文件格式文本(可讀、可手動編輯)二進制(緊湊、不可直接閱讀)
跨平台性好(文本標準)需注意字節序、對齊
性能較慢(格式轉換開銷)快(直接內存拷貝)
適用場景配置、日誌、數據交換、調試高性能存儲、大數據量、內部數據

常見問題與注意事項

  • fscanf 遇空格/換行視為分隔符,讀取字符串時同 scanf 不含空格
  • 讀取含空格字符串請用 fgets 或格式化掃描集 %[^\n]
  • 文本模式下換行符可能轉換(Windows \r\n),二進制模式保持原樣
  • 寫入浮點數預設精度較高,如需固定小數位用 %.2f
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved