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

2024-11-29 01:23:13
推荐回答(1个)
回答1:

//根据楼主给出的 结构体struct student以及函数wirte(),稍作修改.
//假设每个学生选修的课程数目不一定相同,课程名称也不一定相同.
//以下是修改后的测试代码.

#include
#include
#include

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    {
       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    {
       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    {
       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    {
        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    {
        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        {
            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;
}