C语言文件处理与结构体问题:文本数据存入结构体数组并实现排序
解决你的C语言篮球队数据处理作业需求
Got it, let's walk through how to build this program step by step—covering everything from struct definition to file I/O and sorting.
1. 定义球队结构体
首先我们需要一个结构体来存储每支球队的数据,刚好对应你提到的字段:球队名称、总参赛场次、获胜场次。用typedef可以让后续声明变量更简洁:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 定义球队结构体 typedef struct { char name[50]; // 球队名称缓冲区(可根据需求调整大小) int total_games; int wins; } Team;
2. 从文本文件读取数据到结构体数组
接下来写一个函数,把指定.txt文件里的数据读取到Team结构体数组中。我们会做基础的错误检查(比如文件不存在的情况),假设文件每行格式是:球队名 总场次 获胜场次(例如Bulls 82 47)。
// 从文件加载球队数据,返回加载成功的球队数量 int load_teams(const char* filename, Team* teams, int max_teams) { FILE* file = fopen(filename, "r"); if (!file) { perror("打开文件失败"); return -1; } int count = 0; // 逐行读取,直到文件结束或达到最大球队数 while (count < max_teams && fscanf(file, "%s %d %d", teams[count].name, &teams[count].total_games, &teams[count].wins) == 3) { count++; } fclose(file); return count; }
注意:如果你不确定文件里的球队数量,可以用realloc动态扩容数组,但为了简化,这里先用固定大小数组(你可以根据需求调整MAX_TEAMS的值)。
3. 实现排序功能
我们用标准库的qsort函数来做排序,它高效且易用。需要写两个比较函数:一个按球队名称排序,另一个按获胜场次排序(默认降序,毕竟大家更关注赢球多的队伍)。
// 按球队名称升序排序的比较函数 int compare_by_name(const void* a, const void* b) { const Team* teamA = (const Team*)a; const Team* teamB = (const Team*)b; return strcmp(teamA->name, teamB->name); } // 按获胜场次降序排序的比较函数 int compare_by_wins(const void* a, const void* b) { const Team* teamA = (const Team*)a; const Team* teamB = (const Team*)b; // 返回负数表示teamB获胜更多,让qsort按降序排列 return teamB->wins - teamA->wins; }
4. 整合完整程序(带用户交互)
把所有模块整合到主函数里,让用户输入文件名、选择排序方式,最后输出排序结果:
#define MAX_TEAMS 50 // 根据预期球队数量调整 // 打印球队数据的辅助函数 void print_teams(Team* teams, int count) { printf("\n%-20s %-15s %-10s\n", "球队名称", "总参赛场次", "获胜场次"); printf("-------------------------------------------------\n"); for (int i = 0; i < count; i++) { printf("%-20s %-15d %-10d\n", teams[i].name, teams[i].total_games, teams[i].wins); } } int main() { char filename[100]; Team teams[MAX_TEAMS]; int team_count; int sort_choice; // 获取用户输入的文件名 printf("请输入你的.txt文件路径:"); scanf("%s", filename); // 加载球队数据 team_count = load_teams(filename, teams, MAX_TEAMS); if (team_count <= 0) { printf("未加载到球队数据或发生错误。\n"); return 1; } // 让用户选择排序方式 printf("\n请选择排序方式:\n"); printf("1. 按球队名称排序(A-Z)\n"); printf("2. 按获胜场次排序(从高到低)\n"); printf("输入你的选择(1/2):"); scanf("%d", &sort_choice); // 根据选择执行排序 switch (sort_choice) { case 1: qsort(teams, team_count, sizeof(Team), compare_by_name); printf("\n按球队名称排序结果:\n"); break; case 2: qsort(teams, team_count, sizeof(Team), compare_by_wins); printf("\n按获胜场次排序结果:\n"); break; default: printf("无效选择,显示原始数据:\n"); } // 打印结果 print_teams(teams, team_count); return 0; }
关键提示与扩展建议
- 错误处理优化: 目前代码只检查了文件打开失败的情况,你可以额外添加逻辑,比如验证
总参赛场次 >= 获胜场次这类合理性检查。 - 动态数组适配: 如果需要处理不确定数量的球队,可以把固定数组换成
malloc动态分配,读取时用realloc扩容。 - 带空格的球队名: 如果球队名称包含空格(比如
Los Angeles Lakers),需要改用fgets读取整行,再手动解析数据,不能用fscanf。 - 测试用例: 可以用下面的样例
data.txt测试程序:Lakers 82 52 Celtics 82 57 Bulls 82 47 Warriors 82 44
内容的提问来源于stack exchange,提问作者PlagueTR
相关产品推荐
相关产品推荐

