Year,USA,Japan,UK,China,Germany,France,Singapore,Netherlands
1991,258,44,75,0,30,25,0,31
1992,206,74,73,0,28,25,0,24
...
2010,288,224,113,99,72,62,41,52
#include <stdio.h>
#include <stdlib.h>
#define COUNTRY_COUNT 8
#define MAX_LINE 256
int main() {
FILE *fp = fopen("data.csv", "r");
if (!fp) {
perror("無法打開文件");
return 1;
}
char line[MAX_LINE];
// 1. 跳過表頭
if (!fgets(line, sizeof(line), fp)) {
fprintf(stderr, "文件為空\n");
fclose(fp);
return 1;
}
printf("Year Sum\n");
int maxYear = 0;
long maxSum = 0;
int year, vals[COUNTRY_COUNT];
// 2. 逐行解析
while (fgets(line, sizeof(line), fp)) {
// 解析:年份 + 8 個整數,逗號分隔
int parsed = sscanf(line, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
&year,
&vals[0], &vals[1], &vals[2], &vals[3],
&vals[4], &vals[5], &vals[6], &vals[7]);
if (parsed != 9) {
fprintf(stderr, "行格式錯誤: %s", line);
continue;
}
// 3. 計算總和
long sum = 0;
for (int i = 0; i < COUNTRY_COUNT; i++) sum += vals[i];
// 4. 輸出該年總和
printf("%d %ld\n", year, sum);
// 5. 更新最大值
if (sum > maxSum) {
maxSum = sum;
maxYear = year;
}
}
// 6. 輸出最大值信息
if (maxSum > 0) {
printf("\nYear of Maximum Regional Offices = %d\n", maxYear);
printf("Number of Regional Offices = %ld\n", maxSum);
}
fclose(fp);
return 0;
}
fgets + sscanf 組合:比直接 fscanf 更健壯,能處理行尾換行、多餘空格、錯誤行跳過。sscanf 返回成功賦值的項數,必須等於 9 才視為有效行。int 範圍,用 long 或 long long。fclose(fp) 確保文件句柄歸還。Year Sum
1991 463
1992 430
1993 491
...
2008 995
2009 961
2010 951
Year of Maximum Regional Offices = 2008
Number of Regional Offices = 995
vals 數組。mmap 或分塊讀取,避免大行緩衝區溢出。./program > report.txt 直接生成報告文件。通過 fgets 逐行讀取 + sscanf 格式化解析 + 即時累加統計,即可高效、健壯地完成 CSV 數據的讀取、求和與極值查找。代碼結構清晰,錯誤處理完善,易於擴展應對更複雜的數據分析任務。