20251期《C语言程序设计B》专项训练05-文件02-程序P337.C

18 阅读4分钟

题面

编写一程序P337.C实现以下功能
有一存储很多学生成绩的文本文件(学生与课程数不限),每个学生的数据包括学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)。从键盘输入某个学生的姓名,要求在文件中查找有无其成绩记录(可能有多条记录或没有),然后在屏幕上显示出相应的信息。

文件数据,注意,文件名是:xscj.txt

2007033964 杨志刚毅 男 计算机文化基础 53
2007021867 唐露希 女 微积分I 63
2007033964 杨志刚毅 男 微积分I 26
2007072283 李田 男 C语言程序设计 22
2007051538 王坤焱 女 微积分I 0
2007073425 明庆波 男 C语言程序设计 22
2007021536 何亚东 男 C语言程序设计 0
2007033964 杨志刚毅 男 C语言程序设计 0
2007021867 唐露希 女 计算机文化基础 62
2007052372 段卢兵 男 微积分I 51
2007021867 唐露希 女 C语言程序设计 24
2007021536 何亚东 男 微积分I 0
2007073425 明庆波 男 微积分I 50
2007021536 何亚东 男 计算机文化基础 61

保存到程序P337.C所在的文件夹且文件名保持不变。编程可用素材:printf("请输入要查找成绩的学生姓名:")、printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!")、printf("\n查找结果为:\n")、printf("文件中没有找到姓名为“…”的学生\n"…。

测试数据1

李田

请输入要查找成绩的学生姓名:李田  
  
查找结果为:  
1 2007072283, 李田    , 男, C语言程序设计 , 22

测试数据2

杨志刚毅

请输入要查找成绩的学生姓名:杨志刚毅  
  
查找结果为:  
1 2007033964, 杨志刚毅, 男, 计算机文化基础, 53  
2 2007033964, 杨志刚毅, 男, 微积分I       , 26  
3 2007033964, 杨志刚毅, 男, C语言程序设计 , 0

测试数据3

张三

请输入要查找成绩的学生姓名:张三  
  
查找结果为:  
文件中没有找到姓名为“张三”的学生

程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 学生数据
/*
typedef struct student
{
char id[11];		// 学号
char name[9];		// 姓名
char gender[3];		// 性别
char course[15];	// 课程名
int score;			// 成绩
} STU;
*/

int main(void)
{
	char id[11];
	char name[9];
	char inputName[9];
	char gender[3];
	char course[15];
	int score;
	int i = 0;
	
	FILE *fp;
	
	// 开文件 
	fp = fopen("xscj.txt", "r");
	if (NULL == fp)
	{
		printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
		exit(0);
	}
	
	// 处理题设业务
	printf("请输入要查找成绩的学生姓名:");
	gets(inputName);
	printf("\n查找结果为:\n");
	
	// 使用EOF常量判断格式化读取文件是否正确
	while (fscanf(fp, "%s %s %s %s %d", id, name, gender, course, &score) != EOF)
	{
		if (strcmp(name, inputName) == 0)	// 串比较,进行查找
		{
			// 一般情况下,这个文件是按行写入数据的,读的时候,就是按行读出来就行
			// 格式化读入时,读满四个数据,即接着读下一个四个数据,中间合理间隔:空格,\0,\n \t都行
			i++;
			printf("%d %10s, %-8s, %s, %-14s, %d\n", i, id, name, gender, course, score);
		}
	}
	
	// 处理未找到数据的情况
	if (0 == i)
	{
		printf("文件中没有找到姓名为“%s”的学生\n", inputName);
	}
	
	// 关闭文件
	fclose(fp);
	fp = NULL;
	
	return 0;
}


知识点

  • 可以用结构封装数据,也可以直接使用散装数据变量
  • 文件读取
  • 格式化读取文本文件
  • 数据计数处理