C语言 把结构体中的数据写入文件的问题
出现的问题是,运行case9后,程序显示结束return-1;并没有生成并写入文件。程序的那一部分代码如下:typedefstructstudent{charke[20]...
出现的问题是,运行case9后,程序显示结束 return -1;并没有生成并写入文件。程序的那一部分代码如下:typedef struct student{ char ke[20]; char name[15]; char xuehao[15]; int chengji[21]; float average;} AO;int n,m,chengji[50][21]= {0},q,x=0,y,i,j,k,l,c,v;char chaxuehao[15],danke[20];AO xx[50];int main(){again: printf("*************菜单功能************\n"); printf("1、 数据录入\n"); printf("2、 数据加载\n"); printf("3、 数据删除\n"); printf("4、 数据修改\n"); printf("5、 数据查询\n"); printf("6、 数据统计\n"); printf("7、 数据排序\n"); printf("8、 数据显示\n"); printf("9、 数据存储\n"); printf("10、 退出\n");again3: scanf("%d",&l); getchar(); switch(l) { case 1: input(); goto again3; break;// 这是数据输入 case 9: printf("%s",xx[0].name);//检验到case9时是否已经在结构体中存入数据。 write(xx,n,m); break;void input(){ for(i=0; i<49; i++) { xx[i].average=0; for(k=0; k<20; k++) xx[i].chengji[k]=0; } printf("请输入学生个数:"); scanf("%d",&n); printf("\n请输入课程数目:"); scanf("%d",&m); getchar(); for(i=0; i<n; i++) { printf("请输入第%d个学生的姓名:\n",i+1); scanf("%s",xx[i].name);getchar(); } for(i=0; i<m; i++) { printf("请输入第%d堂课程的名称:",i+1); scanf("%s",xx[i].ke);getchar(); } for(i=0; i<n; i++) { printf("请输入%s的学号:",xx[i].name); scanf("%s",xx[i].xuehao); for(j=0; j<m; j++) { printf("请输入%s的%s成绩:",xx[i].name,xx[j].ke); scanf("%d",&xx[i].chengji[j]); getchar(); } } for(i=0; i<n; i++) { for(k=0; k<m; k++) xx[i].chengji[20]+=xx[i].chengji[k]; } for(i=0; i<n; i++)xx[i].average=(float)(xx[i].chengji[20])/m; printf("录入成功!\n");}void wirte(AO data[],int n,int m){ FILE *fp; int i,j; if((fp=fopen("save.txt","w"))==NULL) { printf("存储失败!\n"); return 0; }printf("输入成功!"); fwrite(data,sizeof(AO),n,fp); fclose(fp);}
展开
展开全部
//根据楼主给出的 结构体struct student以及函数wirte(),稍作修改.
//假设每个学生选修的课程数目不一定相同,课程名称也不一定相同.
//以下是修改后的测试代码.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
//原代码char ke[20];
char ke[20][15]; //可存放20个课程名称,每个名称长度最大14
char xuehao[15]; //学号 (学号也可以用int整数型,或者long型)
char name[15]; //姓名
int chengji[21]; //chengji[20]用于保存总成绩
int keQty; //实际选修了多少个课程
float average; //平均分
} AO;
AO xx[50];
//输入数据
int testInput()
{
int n; //实际输入多少个学生
int m; //选修多少个课程
int i;
n=3;
strcpy(xx[0].xuehao,"1001");
strcpy(xx[0].name,"张一");
xx[0].keQty=1;
strcpy(xx[0].ke[0],"math");
xx[0].chengji[0]=90;
m=xx[0].keQty;
for(i=0;i<m;i++)
{
xx[0].chengji[20] += xx[0].chengji[i];
}
xx[0].average = 1.0 * xx[0].chengji[20] / m;
strcpy(xx[1].xuehao,"1002");
strcpy(xx[1].name,"李二");
xx[1].keQty=3;
strcpy(xx[1].ke[0],"math");
strcpy(xx[1].ke[1],"english");
strcpy(xx[1].ke[2],"C");
xx[1].chengji[0]=81;
xx[1].chengji[1]=82;
xx[1].chengji[2]=87;
m=xx[1].keQty;
for(i=0;i<m;i++)
{
xx[1].chengji[20] += xx[1].chengji[i];
}
xx[1].average = 1.0 * xx[1].chengji[20] / m;
strcpy(xx[2].xuehao,"1003");
strcpy(xx[2].name,"王三");
xx[2].keQty=2;
strcpy(xx[2].ke[0],"math");
strcpy(xx[2].ke[1],"english");
xx[2].chengji[0]=85;
xx[2].chengji[1]=86;
m=xx[2].keQty;
for(i=0;i<m;i++)
{
xx[2].chengji[20] += xx[2].chengji[i];
}
xx[2].average = 1.0 * xx[2].chengji[20] / m;
printf("\n录入成功.\n");
return n;
}
//写入文件
void writeFile(AO data[],int n)
{
FILE *fp;
int i;
int ret;
fp=fopen("save.txt","w");
if(fp == NULL)
{
printf("\n打开文件错误.\n");
exit(1);
}
for(i=0;i<n;i++) //将记录逐条写入文件
{
ret=fwrite(&data[i],sizeof(AO),1,fp);
if(ret != 1)
{
printf("\n写入文件时出现错误.\n");
break;
}
}
fclose(fp);
printf("\n写入文件 save.txt 结束.\n");
}
//读取文件
void readFile()
{
AO testData[50]; //临时的结构体数组,只用于测试
FILE *fp;
int n;
int m;
int i,j;
int ret;
fp=fopen("save.txt","r");
if(fp == NULL)
{
printf("\n打开文件错误.\n");
exit(1);
}
n=0;
//函数feof(),检测是否遇到文件结束符,
//如果文件结束,则返回非1值,否则返回0
while( !feof(fp) )
{
ret=fread(&testData[n],sizeof(AO),1,fp);
if(ret == 1)
{
n++;
}
}
fclose(fp); //关闭文件
printf("\n读取文件结束,得到 %d 条记录.\n\n",n);
for(i=0;i<n;i++)
{
printf("第%d个学生\n",i+1);
printf("学号: %s\n",testData[i].xuehao);
printf("姓名: %s\n",testData[i].name);
m=testData[i].keQty;
printf("选修%d个课程\n",m);
for(j=0;j<m;j++)
{
printf("%s: %d\n",testData[i].ke[j],testData[i].chengji[j]);
}
printf("总成绩: %d\n",testData[i].chengji[20]);
printf("平均分: %0.1f\n",testData[i].average);
printf("\n");
}
}
int main(void)
{
int n;
n=testInput(); //输入数据
writeFile(xx,n); //写入文件
readFile(); //读取文件
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询