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);
前提是結構體無指針成員、無填充對齊差異(跨平台需注意)。
總結:**寫循環讀文件賦值,是唯一標準路徑。**