题面
编写一程序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;
}
知识点
- 可以用结构封装数据,也可以直接使用散装数据变量
- 文件读取
- 格式化读取文本文件
- 数据计数处理