一个学生信息管理系统。求各位大神帮忙改改!!!急!!!!!!!明天早上九点之前要交,求助!!!!!!!!

_简单- 2013-07-18 08:00:26
为了实现数据的录入,增删改查,可是遇到了问题,实在不知道该怎么改了。
1.数据录入的时候,后台的“F:\\成绩管理系统.txt”中的数据是乱码,怎么解决。输出数据的时候并没有问题啊。
2.修改数据的时候(也就是这个void Change()),也不能真正的实现数据的修改,具体问题运行看看就会知道了
由于发帖限制,界面的优化我删了。



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 100000


typedef struct student
{
int n; //顺序号
int Num; //学号
char name[10]; //姓名
int C; //语文成绩
int M; //数学成绩
int E; //英语成绩
int P; //物理成绩
int J; //计算机成绩
float Ave; //平均成绩
} Student;

Student stu[SIZE];
//录入数据
void Input()
{
int i;
FILE *fp;
fp=fopen("F:\\成绩管理系统.txt","ab");
for(i=0;i<SIZE;i++)
{
printf("\n请输入序号i(当输入i=-1时,返回),i=",i++);
scanf("%d",&i);
fflush(stdin);
if(i==-1)
{
fclose(fp);
return;
}
else
{
printf("\n请输入学号(数字型):");
scanf("%d",&stu[i].Num);
fflush(stdin);
printf("\n请输入姓名(字符型):");

scanf("%s",stu[i].name);
fflush(stdin);
printf("\n请输入语文成绩(0~100):");

scanf("%d",&stu[i].C);
fflush(stdin);
printf("\n请输入数学成绩(0~100):");
scanf("%d",&stu[i].M);
fflush(stdin);
printf("\n请输入英语成绩(0~100):");
scanf("%d",&stu[i].E);
fflush(stdin);
printf("\n请输入物理成绩(0~100):");
scanf("%d",&stu[i].P);
fflush(stdin);
printf("\n请输入计算机成绩(0~100):");
scanf("%d",&stu[i].J);
fflush(stdin);
stu[i].Ave=(stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
stu[i].n=i;
fwrite(&stu[i],sizeof(Student),1,fp);
}
}
fclose(fp);
}

//输出数据
void Listout()
{
FILE *fp;
int i;
fp=fopen("F:\\成绩管理系统.txt","rb");
system("cls");
printf("***********************************************************************\n");
printf("\t\t\t\t成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
printf("-----------------------------------------------------------------------\n");
system("pause");
fclose(fp);
}

//查找数据
void Search()
{
FILE *fp;
int i,num;
fp=fopen("F:\\成绩管理系统.txt","rb");
rewind(fp);
system("cls");
printf("请输入要查找的学号:");
scanf("%d",&num);
fflush(stdin);
printf("\t\t\t查询结果\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
for(i=0;i<=SIZE;i++)
if(stu[i].Num==num)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
system("pause");
fclose(fp);
}

//增加数据
void Add()
{
int i,s;
FILE *fp;
fp=fopen("F:\\成绩管理系统.txt","ab+");
rewind(fp);
system("cls");
printf("\t\t\t\t成绩列表\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
s=i;
for(i=s;i<SIZE;i++)
{
printf("输入序号i(当输入i=-1时,返回),i=",i);
scanf("%d",&i);
fflush(stdin);
if(i==-1)
{
fclose(fp);
return;
}
else
{
printf("\n\r请输入学号(数字型):");
scanf("%d",&stu[i].Num);
fflush(stdin);
printf("\n\r请输入姓名(字符型):");
scanf("%s",stu[i].name);
fflush(stdin);
printf("\n\r请输入语文成绩(0~100):");
scanf("%d",&stu[i].C);
fflush(stdin);
printf("\n\r请输入数学成绩(0~100):");
scanf("%d",&stu[i].M);
fflush(stdin);
printf("\n\r请输入英语成绩(0~100):");
scanf("%d",&stu[i].E);
fflush(stdin);
printf("\n\r请输入物理成绩(0~100):");
scanf("%d",&stu[i].P);
fflush(stdin);
printf("\n\r请输入计算机成绩(0~100):");
scanf("%d",&stu[i].J);
fflush(stdin);
stu[i].Ave=(stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
stu[i].n=i;
fwrite(&stu[i],sizeof(Student),1,fp);
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
}
fclose(fp);
}
//删除数据
void Delete()
{
FILE *fp;
int i,num,n;
int total =0;
int flag=0;
fp=fopen("F:\\成绩管理系统.txt","rb");
system("cls");
printf("\t\t\t\t成绩列表\n");
printf(" 序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf(" %d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
fclose(fp);
total = i-1;
printf(" 请输入要删除学生的学号:");
scanf("%d",&num);
fflush(stdin);
system("cls");
for(i=0;i<=SIZE;i++)
if(stu[i].Num==num)
{
printf("\t\t\t要删除的学生信息\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
n=i+1;
flag=1;
break;
}
if(flag==0)
{
printf("* 输入错误! *\n");
printf("* 请返回! *\n");
return;
}
printf("\n\n");
for(i=n;i<=total;i++)
{
memcpy(&stu[i-1],&stu[i],sizeof(Student));
}
memset(&stu[total],0,sizeof(Student));

fp=fopen("F:\\成绩管理系统.txt","wb+");
for(i=0;i<total;i++)
{
fwrite(&stu[i],sizeof(Student),1,fp);
}
fclose(fp);

fp=fopen("F:\\成绩管理系统.txt","rb");
printf("\t\t\t当前成绩列表\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
system("pause");
fclose(fp);
}
//修改数据
void Change()
{
FILE *fp;
int i,num,n;
int flag=0;
system("cls");
printf("请输入要修改学生的学号:");
scanf("%d",&num);
fflush(stdin);
for(i=0;i<=SIZE;i++)

if(stu[i].Num==num)
{
printf("\t\t\t\t成绩列表\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
system("pause");
n=i+1;
flag=1;
break;
}
if(flag==0)
{
printf("* 输入错误! *\n");
printf("* 请返回! *\n");
system("pause");
return;
}
printf("\n\n");
fp=fopen("F:\\成绩管理系统.txt","rb+");
fseek(fp,n*sizeof(Student),0);
printf("\n请输入学号(数字型):");
scanf("%d",&stu[i].Num);
fflush(stdin);
printf("\n请输入姓名(字符型):");
scanf("%s",stu[i].name);
fflush(stdin);
printf("\n请输入语文成绩(0~100):");
scanf("%d",&stu[i].C);
fflush(stdin);
printf("\n请输入数学成绩(0~100):");
scanf("%d",&stu[i].M);
fflush(stdin);
printf("\n请输入英语成绩(0~100):");
scanf("%d",&stu[i].E);
fflush(stdin);
printf("\n请输入物理成绩(0~100):");
scanf("%d",&stu[i].P);
fflush(stdin);
printf("\n请输入计算机成绩(0~100):");
scanf("%d",&stu[i].J);
fflush(stdin);
stu[i].Ave=(stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
stu[i].n=i;
fwrite(&stu[i],sizeof(Student),1,fp);
fclose(fp);
fp=fopen("F:\\成绩管理系统.txt","rb");
printf("\t\t\t\t成绩列表\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
system("pause");
fclose(fp);
}

//密码
void password()
{
int mm;
while(1)
{
system("cls");
printf("\t\t 欢迎进入 \n");
printf("\t\t \n");
printf("\t\t 学生信息管理系统 \n");
printf("请输入6位数字密码:");
scanf("%d",&mm);
fflush(stdin);
if(mm-123456!=0) {printf("密码错误,请重新输入!\n");}
else return;
system("pause");
}
}
//主函数
int main()
{
int n;
password();
while(1)
{
system("cls");
printf("\n");
printf("\t\t* 学生信息管理系统 *\n");
printf("\t\t* 主菜单 *\n");
printf("\t\t* *\n");
printf("\t\t* 1.录入数据 *\n");
printf("\t\t* 2.删除数据 *\n");
printf("\t\t* 3.输出数据 *\n");
printf("\t\t* 4.查找数据 *\n");
printf("\t\t* 5.增加数据 *\n");
printf("\t\t* 6.修改数据 *\n");
printf("\t\t* 7.退出系统 *\n");
printf("请输入选择项(1-7):");
scanf("%d",&n);
fflush(stdin);
printf("\n");
if(n>0&&n<=7)
{
switch(n)
{
case 1:Input();break;
case 2:Delete();break;
case 3:Listout();break;
case 4:Search();break;
case 5:Add();break;
case 6:Change();break;
case 7:exit(0);
}
}
else
{
system("cls");
printf("* *\n");
printf("* 输入无效 *\n");
printf("* 请重新输入! *\n");
system("pause");
}

}
return 0;
}
...全文
267 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cobras 2013-07-18
  • 打赏
  • 举报
回复
关于第一个问题。因为是使用二进制存储,所以不能直接显示。建议保留。因为可以支持记录的随机存储。 关于第二个问题。楼主的代码有点混乱。功能有问题。 另:输入功能应该是个顺序输入的过程。怎么会输入记录号呢?记录号是个简单递增的过程。因使用二进制存储。所以支持随机输入。 为什么不采用缓存操作模式,而采用即时更新模式呢?
cobras 2013-07-18
  • 打赏
  • 举报
回复
完善一下,加一些文件错误检查。
/* Student Score Manager */

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

#define DB_FILE "成绩管理系统.txt"
#define DB_SIZE 100000

#define STUDENT_NAME_LENGTH     10

typedef struct student
{
	int n;                    //顺序号
	int Num;                 //学号
	char name[STUDENT_NAME_LENGTH];            //姓名
	int C;                  //语文成绩
	int M;               //数学成绩
	int E;                  //英语成绩
	int P;                 //物理成绩
	int J;                 //计算机成绩
	double Ave;             //平均成绩
}Student;

Student stu[DB_SIZE];

int nstrlen(const char *s, int max)
{
	int i;

	for (i = 0; i < max; ++i) {
		if (s[i] == '\0') {
			break;
		}
	}
	return i;
}

int input_number(const char *text, ...)
{
	va_list vargs;
	int num;

	va_start(vargs, text);
	vprintf(text, vargs);
	va_end(vargs);
	scanf("%d", &num);
	fflush(stdin);
	return num;
}

int input_string(char *buf, int buf_len, const char *text, ...)
{
	va_list vargs;
	int len;

	va_start(vargs, text);
	vprintf(text, vargs);
	va_end(vargs);
	fgets(buf, buf_len, stdin);
	len = nstrlen(buf, buf_len);
	if (len > 0) {
		if (buf[len - 1] == '\n') {
			buf[len - 1] = '\0';
		}
	}
	fflush(stdin);
	return 0;
}

int input_one_record(Student *rec, int i)
{
	rec->Num = input_number("请输入学号(数字型): ");
	input_string(rec->name, sizeof(rec->name), "请输入姓名(字符型): ");
	rec->C = input_number("请输入语文成绩(0~100): ");
	rec->M = input_number("请输入数学成绩(0~100): ");
	rec->E = input_number("请输入英语成绩(0~100): ");
	rec->P = input_number("请输入物理成绩(0~100): ");
	rec->J = input_number("请输入计算机成绩(0~100): ");

	rec->Ave = (rec->C + rec->M + rec->E + rec->P + rec->J) / 5.0;
	rec->n = i;

	return 0;
}

int load_database_file(const char *filename, Student *stu, int len)
{
	FILE *fp;
	int i;

	memset(stu, 0, sizeof(stu) * len);
	fp = fopen(filename, "rb");
	if (fp != NULL) {
		for (i = 0; i < len; i++) {
			if (fread(&stu[i], sizeof(Student), 1, fp) != 1) {
				break;
			}
		}
		fclose(fp);
		return i;
	}
	return -1;
}

int save_database_file(const char *filename, const Student *stu, int count)
{
	FILE *fp;
	int i;

	fp = fopen(filename, "wb");
	if (fp != NULL) {
		for (i = 0; i < count; i++) {
			if (fwrite(&stu[i], sizeof(Student), 1, fp) != 1) {
				break;
			}
		}
		fclose(fp);
		return i;
	}
	return -1;
}

int save_one_record(FILE *fp, const Student *rec, int i)
{
	fseek(fp, i * sizeof(Student), SEEK_SET);
	fwrite(rec, sizeof(Student), 1, fp);
	return 0;
}

int print_one_record(const Student *rec)
{
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n"
		, rec->n, rec->Num, rec->name, rec->C
		, rec->M, rec->E, rec->P, rec->J, rec->Ave);
	return 0;
}

int print_all_records(const Student *stu, int count)
{
	int i;

	printf("***********************************************************************\n");
	printf("\t\t\t\t成绩列表\n");
	printf("-----------------------------------------------------------------------\n");
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("-----------------------------------------------------------------------\n");
	for(i = 0; i < count; i++) {
		printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n"
			, stu[i].n, stu[i].Num, stu[i].name, stu[i].C
			, stu[i].M, stu[i].E, stu[i].P, stu[i].J, stu[i].Ave);
	}
	printf("-----------------------------------------------------------------------\n");
	return 0;
}

int search_one_record_by_no(const Student *stu, int count, int no)
{
	int i;

	for (i = 0; i < count; ++i) {
		if (stu[i].Num == no) {
			return i;
		}
	}
	return -1;
}

//录入数据
void Input(void)
{
	FILE *fp;
	int i;

	system("cls");
	fp = fopen(DB_FILE, "wb");
	if (fp == NULL) {
		printf("不能打开数据库文件\n");
	}else {
		for (i = 0; i < DB_SIZE; i++) {
			i = input_number("请输入序号i=%d: ", i);
			if (i == -1) {
				break;
			}else { 
				input_one_record(&stu[i], i);
				save_one_record(fp, &stu[i], i);
			}
		}
		fclose(fp);
	}
	system("pause");
}

//输出数据
void Listout(void)
{
	int total;

	system("cls");
	total = load_database_file(DB_FILE, stu, DB_SIZE);
	if (total == -1) {
		printf("不能打开数据库文件\n");
	}else {
		print_all_records(stu, total);
	}
	system("pause");
}

//查找数据
void Search(void)
{
	int total;
	int i, num;

	system("cls");
	total = load_database_file(DB_FILE, stu, DB_SIZE);
	if (total == -1) {
		printf("不能打开数据库文件\n");
	}else {
		num = input_number("请输入要查找的学号: ");
		i = search_one_record_by_no(stu, total, num);
		if (i == -1) {
			printf("没找到\n");
		}else {
			printf("\t\t\t查询结果\n");
			print_one_record(&stu[i]);
		}
	}
	system("pause");
}

//增加数据
void Add(void)
{
	int i, total;
	FILE *fp;

	system("cls");
	total = load_database_file(DB_FILE, stu, DB_SIZE);
	if (total == -1) {
		printf("不能打开数据库文件\n");
	}else {
		print_all_records(stu, total);
		fp = fopen(DB_FILE, "ab");
		if (fp == NULL) {
			printf("不能修改数据库文件\n");
		}else {
			for (i = total; i < DB_SIZE; i++) {
				i = input_number("请输入序号i=%d: ", i);
				if (i == -1) {
					break;
				}else {
					input_one_record(&stu[i], i);
					save_one_record(fp, &stu[i], i);
					print_one_record(&stu[i]);
				}
			}
			fclose(fp);
		}
	}
	system("pause");
}

//删除数据
void Delete(void)
{ 
	int i, num;
	int total = 0;
	int flag = 0;

	system("cls");
	total = load_database_file(DB_FILE, stu, DB_SIZE);
	if (total == -1) {
		printf("不能打开数据库文件\n");
	}else {
		print_all_records(stu, total);
		num = input_number("请输入要删除学生的学号: ");
		i = search_one_record_by_no(stu, total, num);
		if (i == -1) {
			printf("*                             输入错误!                               *\n");
			printf("*                              请返回!                                *\n");
		}else {
			printf("\t\t\t要删除的学生信息\n");
			print_one_record(&stu[i]);
			printf("\n\n");
			memcpy(&stu[i], &stu[i + 1], (total - i - 1) * sizeof(Student));
			memset(&stu[total], 0, sizeof(Student));
			--total;
			save_database_file(DB_FILE, stu, total);
			print_all_records(stu, total);
		}
	}
	system("pause");
}

//修改数据
void Change(void)
{
	int i, num;
	int total;

	system("cls");
	total = load_database_file(DB_FILE, stu, DB_SIZE);
	if (total == -1) {
		printf("不能打开数据库文件\n");
	}else {
		print_all_records(stu, total);
		num = input_number("请输入要修改学生的学号: ");
		i = search_one_record_by_no(stu, total, num);
		if (i == -1) {
			printf("*                             输入错误!                               *\n");
			printf("*                              请返回!                                *\n");
		}else {
			printf("\t\t\t\t成绩列表\n");
			print_one_record(&stu[i]);
			printf("\n\n");
			input_one_record(&stu[i], i);
			save_database_file(DB_FILE, stu, total);
			print_all_records(stu, total);
		}
	}
	system("pause");
}

//密码
void password(void)
{
	int mm;

	for (;;) {
		system("cls");
		printf("\t\t     欢迎进入                             \n");
		printf("\t\t                                       \n");
		printf("\t\t                 学生信息管理系统         \n");
		mm = input_number("\n请输入6位数字密码: ");
		if (mm == 123456) {
			return;
		}
		printf("密码错误,请重新输入!\n");
		system("pause");
	}
}

//主函数
int main(void)
{
	int n;

	password();
	for (;;) {
		system("cls");
		printf("\n");
		printf("\t\t*             学生信息管理系统             *\n");
		printf("\t\t*                  主菜单                  *\n");
		printf("\t\t*                                          *\n");
		printf("\t\t*                1.录入数据                *\n");
		printf("\t\t*                2.删除数据                *\n");
		printf("\t\t*                3.输出数据                *\n");
		printf("\t\t*                4.查找数据                *\n");
		printf("\t\t*                5.增加数据                *\n");
		printf("\t\t*                6.修改数据                *\n"); 
		printf("\t\t*                7.退出系统                *\n"); 
		n = input_number("\n请输入选择项(1-7): ");
		if (n > 0 && n <= 7) {
			switch(n) {
			case 1:
				Input();
				break;
			case 2:
				Delete();
				break;
			case 3:
				Listout();
				break;
			case 4:
				Search();
				break;
			case 5:
				Add();
				break;
			case 6:
				Change();
				break;  
			case 7:
				exit(0);  
			}
		}else {
			system("cls");
			printf("*                                                                     *\n");
			printf("*                             输入无效                                *\n");
			printf("*                            请重新输入!                              *\n");
			system("pause");
		}
	}
	return 0;
}
cobras 2013-07-18
  • 打赏
  • 举报
回复
/* Student Score Manager */

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

#define SIZE 100000

typedef struct student
{
	int n;                    //顺序号
	int Num;                 //学号
	char name[10];            //姓名
	int C;                  //语文成绩
	int M;               //数学成绩
	int E;                  //英语成绩
	int P;                 //物理成绩
	int J;                 //计算机成绩
	double Ave;             //平均成绩
}Student;

Student stu[SIZE];

int input_number(const char *text)
{
	int num;

	printf(text);
	scanf("%d", &num);
	fflush(stdin);
	return num;
}

int input_one_record(Student *rec, int i)
{
	printf("请输入学号(数字型):");
	scanf("%d",&rec->Num);
	fflush(stdin);

	printf("请输入姓名(字符型):");
	scanf("%s",rec->name);
	fflush(stdin);

	printf("请输入语文成绩(0~100):");
	scanf("%d",&rec->C);
	fflush(stdin);

	printf("请输入数学成绩(0~100):");
	scanf("%d",&rec->M);
	fflush(stdin);

	printf("请输入英语成绩(0~100):");
	scanf("%d",&rec->E);
	fflush(stdin);

	printf("请输入物理成绩(0~100):");
	scanf("%d",&rec->P);
	fflush(stdin);

	printf("请输入计算机成绩(0~100):");
	scanf("%d",&rec->J);
	fflush(stdin);

	rec->Ave = (rec->C + rec->M + rec->E + rec->P + rec->J) / 5.0;
	rec->n = i;

	return 0;
}

int load_database_file(const char *filename, Student *stu, int len)
{
	FILE *fp;
	int i;

	memset(stu, 0, sizeof(stu));
	fp = fopen(filename, "rb");
	for (i = 0; i < len; i++) {
		if (fread(&stu[i], sizeof(Student), 1, fp) != 1) {
			break;
		}
	}
	fclose(fp);
	return i;
}

int save_database_file(const char *filename, const Student *stu, int count)
{
	FILE *fp;
	int i;

	fp = fopen(filename, "wb");
	for (i = 0; i < count; i++) {
		if (fwrite(&stu[i], sizeof(Student), 1, fp) != 1) {
			break;
		}
	}
	fclose(fp);
	return i;
}

int save_one_record(FILE *fp, const Student *rec, int i)
{
	fseek(fp, i * sizeof(Student), SEEK_SET);
	fwrite(rec, sizeof(Student), 1, fp);
	return 0;
}

int print_one_record(const Student *rec)
{
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n"
		, rec->n, rec->Num, rec->name, rec->C
		, rec->M, rec->E, rec->P, rec->J, rec->Ave);
	return 0;
}

int print_all_records(const Student *stu, int count)
{
	int i;

	printf("***********************************************************************\n");
	printf("\t\t\t\t成绩列表\n");
	printf("-----------------------------------------------------------------------\n");
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("-----------------------------------------------------------------------\n");
	for(i = 0; i < count; i++) {
		printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n"
			, stu[i].n, stu[i].Num, stu[i].name, stu[i].C
			, stu[i].M, stu[i].E, stu[i].P, stu[i].J, stu[i].Ave);
	}
	printf("-----------------------------------------------------------------------\n");
	return 0;
}

int search_one_record_by_no(const Student *stu, int count, int no)
{
	int i;

	for (i = 0; i < count; ++i) {
		if (stu[i].Num == no) {
			return i;
		}
	}
	return -1;
}

//录入数据
void Input(void)
{
	FILE *fp;
	int i;

	fp = fopen("成绩管理系统.txt", "wb");
	for (i = 0; i < SIZE; i++) {
		printf("i=%d", i);
		i = input_number("请输入序号i: ");
		if (i == -1) {
			break;
		}else { 
			input_one_record(&stu[i], i);
			save_one_record(fp, &stu[i], i);
		}
	}
	fclose(fp);
}

//输出数据
void Listout(void)
{
	int total;

	total = load_database_file("成绩管理系统.txt", stu, SIZE);
	system("cls");
	print_all_records(stu, total);
	system("pause");
}

//查找数据
void Search(void)
{
	int total;
	int i, num;

	total = load_database_file("成绩管理系统.txt", stu, SIZE);
	system("cls");
	num = input_number("请输入要查找的学号: ");
	i = search_one_record_by_no(stu, total, num);
	if (i == -1) {
		printf("没找到\n");
	}else {
		printf("\t\t\t查询结果\n");
		print_one_record(&stu[i]);
	}
	system("pause");
}

//增加数据
void Add(void)
{
	int i, total;
	FILE *fp;

	total = load_database_file("成绩管理系统.txt", stu, SIZE);
	system("cls");
	print_all_records(stu, total);
	fp = fopen("成绩管理系统.txt", "ab");
	for (i = total; i < SIZE; i++) {
		printf("i=%d", i);
		i = input_number("请输入序号i: ");
		if (i == -1) {
			break;
		}else {
			input_one_record(&stu[i], i);
			save_one_record(fp, &stu[i], i);
			print_one_record(&stu[i]);
		}
	}
	fclose(fp);
}

//删除数据
void Delete(void)
{ 
	int i, num;
	int total = 0;
	int flag = 0;

	total = load_database_file("成绩管理系统.txt", stu, SIZE);
	system("cls");
	print_all_records(stu, total);
	num = input_number("请输入要删除学生的学号: ");
	i = search_one_record_by_no(stu, total, num);
	if (i == -1) {
		printf("*                             输入错误!                               *\n");
		printf("*                              请返回!                                *\n");
	}else {
		printf("\t\t\t要删除的学生信息\n");
		print_one_record(&stu[i]);
		printf("\n\n");
		memcpy(&stu[i], &stu[i + 1], (total - i - 1) * sizeof(Student));
		memset(&stu[total], 0, sizeof(Student));
		save_database_file("成绩管理系统.txt", stu, total);
		print_all_records(stu, total);
	}
	system("pause");
}

//修改数据
void Change(void)
{
	int i, num;
	int total;

	total = load_database_file("成绩管理系统.txt", stu, SIZE);
	system("cls");
	print_all_records(stu, total);
	num = input_number("请输入要修改学生的学号: ");
	i = search_one_record_by_no(stu, total, num);
	if (i == -1) {
		printf("*                             输入错误!                               *\n");
		printf("*                              请返回!                                *\n");
	}else {
		printf("\t\t\t\t成绩列表\n");
		print_one_record(&stu[i]);
		system("pause");
		printf("\n\n");

		input_one_record(&stu[i], i);
		
		save_database_file("成绩管理系统.txt", stu, total);
		
		print_all_records(stu, total);
	}
	system("pause");
}

//密码
void password(void)
{
	int mm;

	for (;;) {
		system("cls");
		printf("\t\t     欢迎进入                             \n");
		printf("\t\t                                       \n");
		printf("\t\t                 学生信息管理系统         \n");
		mm = input_number("\n请输入6位数字密码: ");
		if (mm == 123456) {
			return;
		}
		printf("密码错误,请重新输入!\n");
		system("pause");
	}
}

//主函数
int main(void)
{
	int n;

	password();
	for (;;) {
		system("cls");
		printf("\n");
		printf("\t\t*             学生信息管理系统             *\n");
		printf("\t\t*                  主菜单                  *\n");
		printf("\t\t*                                          *\n");
		printf("\t\t*                1.录入数据                *\n");
		printf("\t\t*                2.删除数据                *\n");
		printf("\t\t*                3.输出数据                *\n");
		printf("\t\t*                4.查找数据                *\n");
		printf("\t\t*                5.增加数据                *\n");
		printf("\t\t*                6.修改数据                *\n"); 
		printf("\t\t*                7.退出系统                *\n"); 
		n = input_number("\n请输入选择项(1-7): ");
		if (n > 0 && n <= 7) {
			switch(n) {
			case 1:
				Input();
				break;
			case 2:
				Delete();
				break;
			case 3:
				Listout();
				break;
			case 4:
				Search();
				break;
			case 5:
				Add();
				break;
			case 6:
				Change();
				break;  
			case 7:
				exit(0);  
			}
		}else {
			system("cls");
			printf("*                                                                     *\n");
			printf("*                             输入无效                                *\n");
			printf("*                            请重新输入!                              *\n");
			system("pause");
		}
	}
	return 0;
}
LubinLew 2013-07-18
  • 打赏
  • 举报
回复
1.数据录入的时候,后台的“F:\\成绩管理系统.txt”中的数据是乱码,怎么解决。输出数据的时候并没有问题啊。 乱码是因为你使用的是fwrite/fread是操作2进制的,不想看乱码就改用fprintf/fscanf 2.修改数据的时候(也就是这个void Change()),也不能真正的实现数据的修改,具体问题运行看看就会知道了 fwrite时写越界了,写到了一个结构体种

//修改了Change函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE (100000)

typedef struct  student
{
	int n;          //顺序号
	int Num;        //学号
	char name[10];  //姓名
	int C;          //语文成绩
	int M;          //数学成绩
	int E;          //英语成绩
	int P;          //物理成绩
	int J;          //计算机成绩
	float Ave;      //平均成绩
} Student;

Student stu[SIZE];

//录入数据
void Input()
{ 
	int i = 0;  
	FILE *fp = NULL;

	if (NULL == (fp = fopen("E:\\成绩管理系统.txt", "ab")))
	{
		printf("%s:%d\n",__FUNCTION__, __LINE__);
		return;
	}

	for (i = 0; i < SIZE; i++)
	{ 
		printf("\n请输入序号i(当输入i=-1时,返回),i= ",i++);
		scanf("%d",&i);

		if(-1 == i)               
		{
			break;
		}
		else                                      
		{ 
			printf("\n请输入学号(数字型): ");
			scanf("%d",&stu[i].Num);

			printf("\n请输入姓名(字符型): ");
			scanf("%s",stu[i].name);

			printf("\n请输入语文成绩(0~100): ");
			scanf("%d",&stu[i].C);

			printf("\n请输入数学成绩(0~100):");
			scanf("%d",&stu[i].M);

			printf("\n请输入英语成绩(0~100):");
			scanf("%d",&stu[i].E);

			printf("\n请输入物理成绩(0~100):");
			scanf("%d",&stu[i].P);

			printf("\n请输入计算机成绩(0~100):");
			scanf("%d",&stu[i].J);

			stu[i].Ave = (stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
			stu[i].n = i;
			fwrite(&stu[i], sizeof(Student), 1, fp);
		}
	}
	fclose(fp);
}

//输出数据
void Listout(void)
{
	FILE *fp = NULL;
	int i = 0;

	if (NULL == (fp = fopen("E:\\成绩管理系统.txt", "rb")))
	{
		printf("%s:%d\n",__FUNCTION__, __LINE__);
		return;
	}

	system("cls");
	printf("***********************************************************************\n");
	printf("\t\t\t\t成绩列表\n");
	printf("-----------------------------------------------------------------------\n");
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("-----------------------------------------------------------------------\n");
	for(i = 0;fread(&stu[i], sizeof(Student),1,fp)==1; i++)
	{
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
	stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
	}
	printf("-----------------------------------------------------------------------\n");
	system("pause");
	fclose(fp);
}

//查找数据
void Search()
{
FILE *fp;
int i,num;
fp=fopen("F:\\成绩管理系统.txt","rb");    
rewind(fp);
system("cls");
printf("请输入要查找的学号:");
scanf("%d",&num);
fflush(stdin);
printf("\t\t\t查询结果\n");
printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
for(i=0;i<=SIZE;i++)
if(stu[i].Num==num)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
system("pause");
fclose(fp);
}

//增加数据
void Add()
{
	int i,s;
	FILE *fp;
	fp=fopen("F:\\成绩管理系统.txt","ab+");    
	rewind(fp);
	system("cls");
	printf("\t\t\t\t成绩列表\n");
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
	{
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
	stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
	}
	s=i;
	for(i=s;i<SIZE;i++)
	{
	printf("输入序号i(当输入i=-1时,返回),i=",i);
	scanf("%d",&i);
	fflush(stdin);
	if(i==-1)                                  
	{
	fclose(fp);
	return;
	}
	else
	{
	printf("\n\r请输入学号(数字型):");
	scanf("%d",&stu[i].Num);
	fflush(stdin);
	printf("\n\r请输入姓名(字符型):");
	scanf("%s",stu[i].name);
	fflush(stdin);
	printf("\n\r请输入语文成绩(0~100):");
	scanf("%d",&stu[i].C);
	fflush(stdin);
	printf("\n\r请输入数学成绩(0~100):");
	scanf("%d",&stu[i].M);
	fflush(stdin);
	printf("\n\r请输入英语成绩(0~100):");
	scanf("%d",&stu[i].E);
	fflush(stdin);
	printf("\n\r请输入物理成绩(0~100):");
	scanf("%d",&stu[i].P);
	fflush(stdin);
	printf("\n\r请输入计算机成绩(0~100):");
	scanf("%d",&stu[i].J);
	fflush(stdin);
	stu[i].Ave=(stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
	stu[i].n=i;
	fwrite(&stu[i],sizeof(Student),1,fp);
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
	stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
	}
}
fclose(fp);
}
//删除数据
void Delete()
{ 
FILE *fp;
int i,num,n;
int total =0;
int flag=0;    
fp=fopen("F:\\成绩管理系统.txt","rb");
system("cls");
printf("\t\t\t\t成绩列表\n");
printf("    序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("    %d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
fclose(fp);
total = i-1;
printf("    请输入要删除学生的学号:");
scanf("%d",&num);
fflush(stdin);
system("cls");
for(i=0;i<=SIZE;i++)
if(stu[i].Num==num)
{
printf("\t\t\t要删除的学生信息\n");
printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
n=i+1;
flag=1;
break;
}
if(flag==0)
{
printf("*                             输入错误!                               *\n");
printf("*                              请返回!                                *\n");
return;
}
printf("\n\n");  
for(i=n;i<=total;i++)
{
memcpy(&stu[i-1],&stu[i],sizeof(Student));
}
memset(&stu[total],0,sizeof(Student));

fp=fopen("E:\\成绩管理系统.txt","wb+");
for(i=0;i<total;i++)
{
fwrite(&stu[i],sizeof(Student),1,fp);
}    
fclose(fp);

fp=fopen("E:\\成绩管理系统.txt","rb");
printf("\t\t\t当前成绩列表\n");
printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
for(i=0;fread(&stu[i],sizeof(Student),1,fp)==1;i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
}
system("pause");
fclose(fp);
}
//修改数据
void Change()
{ 
	FILE *fp = NULL;
	int i,num,n;
	int flag = 0;

	system("cls");
	printf("请输入要修改学生的学号:");
	scanf("%d",&num);
	fflush(stdin);

	for (i = 0; i <= SIZE; i++)
	{
		if (stu[i].Num == num)
		{
			printf("\t\t\t\t成绩列表\n");
			printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
			printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
											stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
			n = i + 1;
			flag = 1;
			break;
		}
	}

	if(flag == 0)
	{
		printf("*                             输入错误!                               *\n");
		printf("*                              请返回!                                *\n");
		system("pause");
		return;
	}

	printf("\n\n");  

	fp = fopen("E:\\成绩管理系统.txt","r+b");

	printf("\n请输入学号(数字型):");
	scanf("%d",&stu[i].Num);

	printf("\n请输入姓名(字符型):");
	scanf("%s",stu[i].name);

	printf("\n请输入语文成绩(0~100):");
	scanf("%d",&stu[i].C);

	printf("\n请输入数学成绩(0~100):");
	scanf("%d",&stu[i].M);

	printf("\n请输入英语成绩(0~100):");
	scanf("%d",&stu[i].E);

	printf("\n请输入物理成绩(0~100):");
	scanf("%d",&stu[i].P);

	printf("\n请输入计算机成绩(0~100):");
	scanf("%d",&stu[i].J);

	stu[i].Ave=(stu[i].C+stu[i].M+stu[i].E+stu[i].P+stu[i].J)/5.0;
//	stu[i].n=i;
	fseek(fp, i * sizeof(Student), SEEK_SET);
	fwrite(&stu[i], sizeof(Student), 1, fp);
	fclose(fp);

	system("cls");

	fp = fopen("E:\\成绩管理系统.txt","rb");
	printf("\t\t\t\t成绩列表\n");
	printf("序号  学号     姓名    语文    数学    英语    物理    计算机    平均\n");
	for(i = 0; fread(&stu[i],sizeof(Student),1,fp) == 1; i++)
	{
		printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",stu[i].n,stu[i].Num,stu[i].name,stu[i].C,
		stu[i].M,stu[i].E,stu[i].P,stu[i].J,stu[i].Ave);
	}
#if 0
	fseek(fp, n * sizeof(Student), SEEK_SET);
	Student s;
	fread(&s,sizeof(Student), 1, fp);
	printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",s.n,s.Num,s.name,s.C,
		s.M,s.E,s.P,s.J,s.Ave);
#endif
	system("pause");
	fclose(fp);
}

//密码
void password()
{
int mm;
while(1)
{
system("cls");
printf("\t\t     欢迎进入                             \n");
printf("\t\t                                       \n");
printf("\t\t                 学生信息管理系统         \n");
printf("请输入6位数字密码:");
scanf("%d",&mm);
fflush(stdin);
if(mm-123456!=0) {printf("密码错误,请重新输入!\n");}
else return;
system("pause");
}
}
//主函数
int main()
{
int n;
password();
while(1)
{
system("cls");
printf("\n");
printf("\t\t*             学生信息管理系统             *\n");
printf("\t\t*                  主菜单                  *\n");
printf("\t\t*                                          *\n");
printf("\t\t*                1.录入数据                *\n");
printf("\t\t*                2.删除数据                *\n");
printf("\t\t*                3.输出数据                *\n");
printf("\t\t*                4.查找数据                *\n");
printf("\t\t*                5.增加数据                *\n");
printf("\t\t*                6.修改数据                *\n"); 
printf("\t\t*                7.退出系统                *\n"); 
printf("请输入选择项(1-7):");
scanf("%d",&n);
fflush(stdin);
printf("\n");
if(n>0&&n<=7)
{
switch(n)
{
case 1:Input();break;
case 2:Delete();break;
case 3:Listout();break;
case 4:Search();break;
case 5:Add();break;
case 6:Change();break;  
case 7:exit(0);  
}
}
else 
{
system("cls");
printf("*                                                                     *\n");
printf("*                             输入无效                                *\n");
printf("*                            请重新输入!                              *\n");
system("pause");
}

}
return 0;
}

Corner 2013-07-18
  • 打赏
  • 举报
回复
当然是乱码了……你是把结构体打印出去了,你应该打印字符串
一根烂笔头 2013-07-18
  • 打赏
  • 举报
回复
不用字节方式打开,把b去掉!换成+或者w。都试试吧
一根烂笔头 2013-07-18
  • 打赏
  • 举报
回复
不用txt格式的,用.ini格式文件试一试
一根烂笔头 2013-07-18
  • 打赏
  • 举报
回复

fp=fopen("F:\\成绩管理系统.txt","ab");   
打开格式符换成a+试试

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧