首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體數組從文件初始化:讀取循環賦值

     編輯:程式設計綜合問答

問題

struct achievement {
    int number;
    char name[20];
    char sex;
    float a1, a2, a3;
} tab_achievement[N];
// 數據在 txt 文件中,如何初始化?

核心原則

C 語言不支持從文件直接初始化結構體數組(初始化列表只能是編譯期常量)。必須在運行時讀取文件並逐項賦值。

標準讀取流程

FILE *fp = fopen("data.txt", "r");
if (!fp) { perror("open"); return -1; }

for (int i = 0; i < N; i++) {
    // 假設文件每行格式:number name sex a1 a2 a3
    int ret = fscanf(fp, "%d %19s %c %f %f %f",
                     &tab_achievement[i].number,
                     tab_achievement[i].name,
                     &tab_achievement[i].sex,
                     &tab_achievement[i].a1,
                     &tab_achievement[i].a2,
                     &tab_achievement[i].a3);
    if (ret != 6) break; // 讀取結束或格式錯誤
}
fclose(fp);

關鍵點

  • %19s 防止名字溢出(預留結束符)。
  • %c 讀取單字符(性別),注意前導空白,可用 %c 跳過換行符。
  • 檢查 fscanf 返回值確保讀取完整。
  • 文件格式建議:每行一條記錄,字段用空格/制表符分隔,便於解析。

進階:二進制讀寫(高效)

// 寫入
fwrite(tab_achievement, sizeof(struct achievement), N, fp);
// 讀取
fread(tab_achievement, sizeof(struct achievement), N, fp);

前提是結構體無指針成員、無填充對齊差異(跨平台需注意)。

總結:**寫循環讀文件賦值,是唯一標準路徑。**

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