#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <errno.h>
#define PATH "D:\\vs-code\\my-code\\course.txt"
#define LINE 200
struct Student
{
int coures_id[1024];//课程号
char coures_name[60];//课程名称
char credit[10];//学分
char grade[4];//修读年级
char term[2];//学期
char coures_pro[20];//课程性质
char coures_englishname[300];
char isread[50];//是否修读
};
static int howcount=0;
static int weather=0;
static char head[1024];
int print_first_line( FILE *file);
int get_data(FILE *file,struct Student student[], int* count);
void printdate(struct Student student_data[]);
void print_course(struct Student student[]);
int main(int argc,char *argv[])
{
//防止出现汉字乱码化
SetConsoleOutputCP(CP_UTF8);
FILE *file;
int count = 0;
int islook= 0;
char head[1024];
struct Student student_data[LINE];
printf("录入数据时否查看录入时的情况:[1=yes][0=no]\n");
scanf("%d",&weather);
if((file = fopen(PATH,"r"))==0)//打开文件
{
printf("open the data file error:%s\n",strerror(errno));
return -1;
}
//打印第一行,列出相关消息
if((print_first_line(file))<0)
{
printf("print_firstline error:%s\n",strerror(errno));
return -2;
}
//将文档中的内容存储到结构体数组中
while(1)
{
if (( get_data(file,student_data,&count))<0)
{
printf("get_data opened error:%s\n",strerror(errno));
return -3;
}
if(count==1)//判断文档中内容是否结束
{
break;
}
}
fclose(file);//录入结束,关闭文件
printf("是否查看录入后的情况:[1=yes][0=no]\n");
scanf("%d",&islook);
if(1==islook)
{
print_course(student_data);
}
printf("这个文档有 %d 个课程\n",howcount);
printf("这是该文档的学习进度状况\n");
printdate(student_data);//打印学分情况表格
return 0;
}
//读取并且保存第一行相关文字
int print_first_line(FILE *file)
{
fgets(head,sizeof(head),file);
return 0;
}
//获取内容
int get_data(FILE *file,struct Student student[], int *count)
{
static int i=0;
char line[1024];
fscanf(file,"%s",student[i].coures_id);//学号
fscanf(file,"%s",student[i].coures_name);//名字
fscanf(file,"%s",student[i].credit);//学分
fscanf(file,"%s",student[i].grade);//修读年级
fscanf(file,"%s",student[i].term);//学期
fscanf(file,"%s",student[i].coures_pro);//课程性质
fscanf(file,"%s",student[i].isread);//是否修读
fgets(line,sizeof(line),file);
if(weather == 1)
{
printf("%s\n",student[i].coures_id);
printf("%s\n",student[i].coures_name);
printf("%s\n",student[i].credit);
printf("%s\n",student[i].grade);
printf("%s\n",student[i].term);
printf("%s\n",student[i].coures_pro);
printf("%s\n",student[i].isread);
}
if(fgets(student[i].coures_englishname,sizeof(student[i].coures_englishname),file)==NULL)//英语名字
{
*count = 1;
}
i ++;
howcount++;
return 0;
}
//打印学分情况表格
void printdate(struct Student student_data[])
{
double sum=0,sum2=0,sum3=0;
int num=0;
int ati=0;
double atf=0,atf2=0,atf3=0;
for(num=0;num<=howcount;num++)
{
if((ati=atoi(student_data[num].isread))==1)
{
atf=atof(student_data[num].credit);
sum+=atf;
}
if((ati=atoi(student_data[num].isread))==0)
{
atf2=atof(student_data[num].credit);
sum2 +=atf2;
}
atf3=atof(student_data[num].credit);
sum3 +=atf3;
}
printf("——————————————————————————————————————————————————\n");
printf("| 情况 | 学分 |\n");
printf("——————————————————————————————————————————————————\n");
printf("| 全部学分 | %.2lf |\n",sum3);
printf("——————————————————————————————————————————————————\n");
printf("| 已修学分 | %.2lf |\n",sum);
printf("——————————————————————————————————————————————————\n");
printf("| 未修学分 | %.2lf |\n",sum2);
printf("——————————————————————————————————————————————————\n");
}
//打印课程信息
void print_course(struct Student student[])
{
printf("%s",head);
for(int i=0;i<howcount;i++)
{
printf("%s %s %s %s %s %s %s \n",student[i].coures_id,student[i].coures_name,student[i].credit,student[i].grade,student[i].term,student[i].coures_pro,student[i].coures_englishname);
}
}
通过一些简单的函数将txt文件中的数据读取并且存储到结构体数组中去,并计算出学分情况统计图,相当于复习c语言基础知识。当是也有多处不足,望各位海涵。欢迎关注,交流。