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

C语言无法读取Team_Detail.txt内容及联赛赛程编排逻辑咨询

问题定位与修复

根因分析

display函数无法输出球队数据的核心问题出在write函数的逻辑:你仅将用户输入的球队名读取到了局部变量team_name中,完全没有执行写入文件的操作,所以Team_Detail.txt中没有存储任何有效球队数据,自然读取不到内容。
此外还有3个影响功能的兼容问题:

  • fflush(stdin)是C标准未定义行为,仅在部分Windows平台编译器可用,跨平台会出现清空输入缓冲区失效的问题
  • 调用scanf("%d", &n)后输入缓冲区残留的换行符会被后续的%[^\n]直接读取为空,导致第一次球队名输入失效
  • 写入时没有给每个球队名追加换行符,后续读取会把所有球队名拼接为一整行

修复后的完整代码

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1000

int write_teams() // 避免和系统调用重名,修改函数名
{
    char team_name[50];
    int i,n;
    printf("------------------------------------------------------\n");
    printf("Enter number of Teams: ");
    scanf("%d",&n);
    // 清空scanf残留的换行符
    while(getchar() != '\n');

    FILE *fptr;
    fptr = fopen("Team_Detail.txt","a");
    if(fptr == NULL)
    {
        printf("Error!");
        exit(1);
    }
    for (i=0;i<n;++i)
    {      
        printf("------------------------------------------------------\n");
        printf("Enter the Team Name:-");
        scanf("%[^\n]",team_name);
        // 核心修复:将球队名写入文件,追加换行符分隔
        fprintf(fptr, "%s\n", team_name);
        // 清空当前输入残留的换行符
        while(getchar() != '\n');
    }
    fclose(fptr);
    return 0;
}

int display()
{
    FILE * fptr;
    char buffer[BUFFER_SIZE];
    int totalRead = 0 ;

    fptr = fopen("Team_Detail.txt","r");
    if(fptr == NULL)
    {
        printf("Unable to open file.\n");
        printf("Please check whether file exists or not");
        exit(EXIT_FAILURE);
    }
    printf("------------------------------------------------------\n");
    while(fgets(buffer, BUFFER_SIZE, fptr ) != NULL) 
    {
        totalRead = strlen(buffer);
        buffer[totalRead - 1] = buffer[totalRead - 1] == '\n' 
                                ? '\0' 
                                : buffer[totalRead - 1];
        printf("%s\n", buffer);
        printf("------------------------------------------------------------------------------------------------------------------\n"); 
    }
    fclose(fptr);
    return 0;
}

int main()
{
    printf("------------------------------------------------------\n");
    printf("Football League System\n");
    printf("------------------------------------------------------\n");
    int choice;

    while(1)
    {   
        printf("\n");
        printf(" Press 1 to Enter the Details of the Team \n");
        printf(" Press 2 to Display Team Details \n");
        printf(" Press 3 to Exit \n");
        printf("------------------------------------------------------\n");
        printf("Enter your choice :  ");
        scanf("%d",&choice);
        // 清空输入残留
        while(getchar() != '\n');
        switch(choice)
        {
            case 1:
                write_teams();
                break;
            case 2:
                display();
                break;
            case 3:
                printf("program finished\n");
                exit(0);
                break;
            default:
                printf("Invalid Input entered\n");
        }
    }
    return 0;
}

注:将原函数名write修改为write_teams,避免和Linux系统下的write系统调用重名引发编译错误。

球队两两对阵赛程编排逻辑建议
  • 第一步:将所有球队读取到内存。定义二维字符数组char teams[200][50]存储所有球队名称,统计球队总数量n,如果n为奇数可以补充1个虚拟的「轮空」球队凑成偶数,降低编排复杂度。
  • 第二步:使用贝格尔编排法生成单循环赛程:
    1. 固定数组第一个位置的球队,其余球队按逆时针方向轮转,每轮生成n/2组对阵
    2. 共需要编排n-1轮,可保证每支球队都和其余所有球队对阵1次
    3. 如果需要实现主客场双循环赛制,只需要将单循环的所有对阵主客场颠倒,再生成一遍赛程即可
  • 第三步:赛程持久化。可以将生成的每轮对阵写入单独的schedule.txt文件存储,方便后续查询调用。

内容的提问来源于stack exchange,提问作者Gowtham Muni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:03