C语言 把结构体中的数据写入文件的问题

出现的问题是,运行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;
}

温馨提示:答案为网友推荐,仅供参考
相似回答