学生信息管理系统,fread和fwite有问题,求人看看
猿朗 2020-04-10 12:46:15
函数块creat_file中 的 fwrite函数没有把信息写入 stud文件,求修改
#include<stdio.h>
#include<stdlib.h>
#include<string>
#define LEN sizeof(struct student)
typedef struct student
{
long no;
char name[20];
int math, chinese, english, total;
}ST;
ST per[100], s_name[100], s[100];
int n,count;
void print(ST s[], int n)
{
int i;
printf("学号 姓名 数学 语文 英语 总成绩\n");
for (i = 0; i < n; i++)
printf("%-12d%-15s%-6d%-6d%-6d%-6d\n", s[i].no, s[i].name, s[i].math,
s[i].chinese, s[i].english, s[i].total);
printf("\n");
}
void menu()
{
printf("NO.1 创建学生信息文件student_data,并输出学生信息\n");
printf("NO.2 将学生信息读入到一个数组s中,并统计学生个数,将数组s按学号从小到大排,输出到屏幕和文件");
printf("s_no.data中\n");
printf("NO.3 将学生信息从数组s拷贝到s_name中,将s_name按姓名排序,输出到屏幕和文件\n");
printf("NO.4 在二的基础上插入908114045,李成,67,73,68,208保持输出\n");
printf("NO.5 输入一个学号,删除他,并输出删除人的信息,和删除后的情况\n");
}
void creat_file()
{
errno_t err;
int i, n;
FILE *fp;
i = 0, n = 0;
char sign = 'y';
while (sign != 'n'&&sign != 'N')
{
printf(" ----学生添加----\n");
printf("学号:\n");
scanf_s("%ld", &per[i].no);
printf("姓名:\n");
scanf_s("%s", per[i].name, 20);
printf("语文:\n");
scanf_s("%d", &per[i].chinese);
printf("英语:\n");
scanf_s("%d", &per[i].english);
printf("数学: \n");
scanf_s("%d", &per[i].math);
printf("是否继续添加\n");
scanf_s(" %c", &sign);
i++;
n++;
}
printf("学生共有%d人\n", n);
if ((err = (fopen_s(&fp, "stud", "w"))) != 0) //读出文件stud的数据
{
printf("文件打开失败");
exit(0);
}
print(per, n);
for (i = 0; i<n; i++)
if (fwrite(&per[i], LEN, 1, fp) != 1) //写入文件
printf("filw write error");
fclose(fp);
}
void read_sort() //按学号排序
{ errno_t err;
FILE *fp1, *fp2;
int i = 0, j;
ST p, t;
if ((err = (fopen_s(&fp1, "stud", "w"))) != 0) //读出文件stud的数据
{
printf("文件打开失败");
exit(0);
}
while (fread(&p, sizeof(ST), 1, fp1)) //读信息
{
s[i] = p; i++; count++; //出错的地方,count的值为0,应该没有读入数据把?
};
fclose(fp1);
printf("学生个数=%d\n", count);
printf("按学号排序前\n");
print(s, count);
for (j = 0; j < count - 1; j++) //冒泡排序
for (i = 0; i < count - 1 - j; i++)
if (s[i].no > s[i + 1].no)
{
t = s[i], s[i] = s[i + 1], s[i + 1] = t;
}
printf("按学号排序后\n");
print(s, count);
if ((err = (fopen_s(&fp2, "stud", "w"))) != 0) //读出文件stud的数据
{
printf("文件打开失败");
exit(0);
}
for (i = 0; i < count; i++)
fwrite(&s[i], sizeof(ST), 1, fp2);
fclose(fp2);
}
void sort_name()
{
int i, j;
ST p;
FILE *fp2;
for (i = 0; i < count; i++)
s_name[i] = s[i];
printf("按姓名排序前\n");
print(s_name, count);
for (j = 0; j < count - 1; j++) //冒泡排序
for (i = 0; i < count - 1 - j; i++)
if (strcmp((char*)s_name[i].name, (char*)s_name[i + 1].name) > 0)
{
p = s_name[i], s_name[i] = s_name[i + 1], s_name[i + 1] = p;
}
printf("按姓名排序后\n");
print(s_name, count);
fp2 = fopen("s_name.data", "wb");
for (i = 0; i < count; i++)
fwrite(&s_name[i], sizeof(ST), 1, fp2);
fclose(fp2);
}
void insert(ST s[],int n)
{
int i;
ST p;
printf("4:插入学生信息:");
printf("请输入要插入的学生的学号、姓名、数学、语文、英语、总成绩\n");
scanf_s("%ld%s%d%d%d%d", &p.no, p.name, &p.math, &p.chinese, &p.english, &p.total);
if (n >= 100) printf("数组已满,不能插入\n");
else
{
printf("0908114045,\"李成\", 67,73,68,208插入前\n");
print(s, count);
for (i = n - 1; i >= 0 && s[i].no > p.no; i--) //找插入位置
s[i + 1] = s[i];
s[i + 1] = p;//插入
}
count++;
printf("0908114045,\"李成\", 67,73,68,208插入后\n");
print(s, count);
}
void delet(ST s[], int n, int no) //删除学号为no的学生,学生个数-1
{
int i = 0, j = 0;
printf("删除学号为908114023的学生前\n");
print(s, count);
while (i < n)
{
if (s[i].no != no) { s[j] = s[i]; i++, j++; }
else {
printf("删除的学生信息为:\n");
printf("学号 姓名 数学 语文 英语 总成绩\n");
printf("%-12d%-15s%-6d%-6d%-6d%-6d\n", s[i].no, s[i].name, s[i].math,
s[i].chinese, s[i].english, s[i].total);
i++,
count--;
}
}
printf("删除学号为908114023的学生后\n");
print(s, count);
}
int main()
{
long no;
ST p;
int num;
menu();
scanf_s("%d", &num);
while (num != 0) {
switch (num)
{
case 1: creat_file(); menu(); scanf_s("%d", &num); break;
case 2: read_sort(); menu(); scanf_s("%d", &num); break;
case 3: sort_name(); menu(); scanf_s("%d", &num); break;
case 4: insert(s,count); menu(); scanf_s("%d", &num); break;
case 5: delet(s,count,no); menu(); scanf_s("%d", &num); break;
default: printf("请重兴输入n值"); scanf_s("%d", &num); break;
}
}
return 0;
}