通过程序输入一个学生的信息:
这时students.txt里存储的是乱码,当用程序输出时,输出结果也是乱码:
这个问题该如何解决呢?
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
int n=0;
struct Student{ //设置结构体变量,储存学生信息
int id; //学号
char name[10]; //姓名
char gender[10]; //性别
int age; //年龄
int MathAna; //数学分析成绩
int LiAlg; //高等代数成绩
int Computer; //程序设计成绩
int English; //大学英语成绩
float GPA; //平均学分绩GPA
};
struct Student st[100];
void menu(); //菜单
void count();
void input(); //输入学生信息
void output(); //输出学生信息
int main()
{
SetConsoleOutputCP(65001);
int i;
menu(); //调用菜单函数,显示菜单界面
scanf("%d",&i); //输入数字,进入不同功能
while(i)
{
switch(i){
case 1: input(); break;
case 8: output(); break;
default: break;
}
menu();
scanf("%d",&i);
}
}
void menu() //该函数用于实现菜单界面
{
printf("\n\n\n\n");
printf("\t\t|***************学生信息管理系统***************|\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|\t\t 1.输入学生信息\t |\n");
printf("\t\t|\t\t 2.修改学生信息\t |\n");
printf("\t\t|\t\t 3.查询学生信息\t |\n");
printf("\t\t|\t\t 4.按GPA排序\t |\n");
printf("\t\t|\t\t 5.按性别统计\t |\n");
printf("\t\t|\t\t 6.按年龄统计\t |\n");
printf("\t\t|\t\t 7.显示挂科学生信息\t |\n");
printf("\t\t|\t\t 8.显示所有学生信息\t |\n");
printf("\t\t|\t\t 9.删除学生信息\t |\n");
printf("\t\t|\t\t 0.退出系统\t\t |\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|**********************************************|\n\n");
printf("请您选择操作(0-9):");
}
void count()
{
struct Student stu1;
FILE * fp; //定义一个文件指针fp
fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
if (fp == NULL) //判断文件是否为空
printf("Cannot open file!");
int n = 0; //初始化
while (1)
{
if (feof(fp)) //检测文件是否结束
break;
fread( & stu1, sizeof(struct Student), 1, fp); //读取文件
n++; //读取文件数
}
n--; //关闭文件数
fclose(fp); //关闭文件
}
void input() //该程序用于实现输入学生信息
{
int i = 0; //学生人数初始化//
char c;
FILE * fp; //定义一个文件指针fp//
count(); //实时检测总数n//
fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
do
{
printf("请输入学生的个人信息:\n");
printf("\n请输入第%d位学生的信息:\n", n + 1);
printf("请输入学生的学号:");
scanf("%d", &st[i].id);
printf("请输入学生的姓名:");
getchar();
scanf("%s", st[i].name);
printf("请输入学生的性别:");
getchar();
scanf("%s",st[i].gender);
printf("请输入学生的年龄:");
scanf("%d",&st[i].age);
printf("请输入学生的数学分析成绩:");
scanf("%d", &st[i].MathAna);
printf("请输入学生的高等代数成绩:");
scanf("%d", &st[i].LiAlg);
printf("请输入学生的程序设计成绩:");
scanf("%d",&st[i].Computer);
printf("请输入学生的大学英语成绩:");
scanf("%d", &st[i].English);
printf("请输入学生的GPA:");
scanf("%f",&st[i].GPA);
fwrite( & st[i], sizeof(struct Student), 1, fp); //以方式将其写入students文本文件
i++;
n++;
printf("\n\n\t\t\t\t是否继续输入(Y/N):");
getchar(); //提示是否继续,从键盘获得一个字符
scanf("%c", &c);
}
while ( c == 'y' || c == 'Y');
fclose(fp);
}
void output() // 该程序用于实现输出学生信息
{
int i;
char c;
FILE *fp; // 定义一个文件指针fp
fp = fopen("students.txt", "rt"); // 以"读取的" 方式打开students文本文件
printf("|#学号\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
do
{
for (i = 0; !feof(fp); i++, n++)
{
fread(&st[i], sizeof(struct Student), 1, fp);
printf(" %d ", st[i].id);
printf(" %s ", st[i].name);
printf(" %s ", st[i].gender);
printf(" %d ", st[i].age);
printf(" %d ", st[i].MathAna);
printf(" %d ", st[i].LiAlg);
printf(" %d ", st[i].Computer);
printf(" %d ", st[i].English);
printf(" %f \n", st[i].GPA);
}
printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); // 提示是否继续
scanf("%c", &c);
c = getchar();
} while (c == 'y' || c == 'Y');
fclose(fp); // 关闭文件
}