You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:18