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个虚拟的「轮空」球队凑成偶数,降低编排复杂度。 - 第二步:使用贝格尔编排法生成单循环赛程:
- 固定数组第一个位置的球队,其余球队按逆时针方向轮转,每轮生成
n/2组对阵 - 共需要编排
n-1轮,可保证每支球队都和其余所有球队对阵1次 - 如果需要实现主客场双循环赛制,只需要将单循环的所有对阵主客场颠倒,再生成一遍赛程即可
- 固定数组第一个位置的球队,其余球队按逆时针方向轮转,每轮生成
- 第三步:赛程持久化。可以将生成的每轮对阵写入单独的
schedule.txt文件存储,方便后续查询调用。
内容的提问来源于stack exchange,提问作者Gowtham Muni
相关产品推荐
相关产品推荐

