将n个学生的信息存入student.dat文件,文件为二进制文件。什么意思啊怎么打开这个student。dat文件

  1. (简答题)
    首先从键盘输入n名学生的信息:学号(8位整数)、姓名(20个字符)、性别(1个字符)3门课的成绩(2位小数)。然后计算每个学生的平均成绩(2位小数),总成绩(2位小数)信息,要求n个学生的信息管理用动态链表实现。然后将链表根据学生总成绩按从大到小的顺序排序后把学生的信息存入工程文件夹下的student.dat二进制文件,注意,文件中每个学生的信息均用二进制方式存储。

input

输入数据有1组,每组有n个学生信息。

output

将n个学生的信息存入student.dat文件,文件为二进制文件。

本次实验题目不需要提交在线OJ,将程序代码截图、运行截图和写入文件内容的截图上传即可。


#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct student
{
    int id;
    char name[50];
    char sex;
    float a[5];
    struct student*next;
}Node;
Node*Create(Node*head,int n);
Node*Sort(Node*head);
int main()
{
    int i,n;
    FILE*fp;
    Node*head,*p;
    head=(Node*)malloc(sizeof(Node));
    scanf("%d",&n);
    head=Create(head,n);
    head=Sort(head);
    if((fp=fopen("d:\\student.dat","wb+"))==NULL)
    {
        printf("Fail...\n");
        exit(0);
    }
    p=head->next;
    while(p!=NULL)
    {
      fwrite(p,sizeof(Node),1,fp);
      p=p->next;
    }
    rewind(fp);
    for(i=0;i<n;i++)
    {
        p=(Node*)malloc(sizeof(Node));
        fread(p,sizeof(Node),1,fp);
        printf("%d %s %c %.2f %.2f %.2f %.2f %.2f\n",p->id,p->name,p->sex,p->a[0],p->a[1],p->a[2],p->a[3],p->a[4]);
    }
    fclose(fp);
    return 0;
}
Node*Create(Node*head,int n)
{
    Node*p,*tp;
    int i;
    head->next=NULL;
    tp=head;
    for(i=0;i<n;i++)
    {
        p=(Node*)malloc(sizeof(Node));
        scanf("%d",&p->id);
        getchar();
        gets(p->name);
        scanf("%c",&p->sex);
        scanf("%f%f%f",&p->a[0],&p->a[1],&p->a[2]);
        p->a[3]=(p->a[0]+p->a[1]+p->a[2])/3;
        p->a[4]=p->a[0]+p->a[1]+p->a[2];
        p->next=tp->next;
        tp->next=p;
        tp=p;
    }
    return head;
}
Node*Sort(Node*head)
{
    Node*p,*q;
    for(p=head->next;p->next;p=p->next)
        for(q=p->next;q;q=q->next)
            if(q->a[4]>p->a[4])
        {
            Node*p_next=p->next;
            Node*q_next=q->next;
            Node t=*p;
            *p=*q;
            *q=t;
            p->next=p_next;
            q->next=q_next;
        }
    return head;
}

以二进制方式写入文件,产生的就是二进制文件。二进制文件可以拖放到记事本中打开,显示为乱码即正常。