| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3981 人关注过本帖
标题:如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教 ...
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:12 
如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教。。。

fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。
fread(pstu,sizeof(struct student),1,fp);//把 fp 所指向的文件 stud 里的数据读入计算机内 pstu 所指向的内存地址上。

上面两句是程序里的写入文件和读出文件语句。我想问的是。。我写得 pstu 指针指向的是动态链表。我这样向文件写入数据和读出数据是否有错。因为书上是静态的,是用 for() 语句将结构体类型数组循环写入或读出的。是否动态链表的每个结点也要这样循环写入或读出?虽然程序输出结果没错,但总感觉有点怪怪的。因为这文件的写入和读出,文件里到底写入没有也不知道,读出的到底是文件里的数据还是本来就是内存上的数据也不知道。。
还有就是怎么对动态链表进行冒泡排序,请各位能人,高手指点一下。。

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
int n = 0;

struct student //定义结构体
{
    int num;
    char name[20];
    float score[3];
    float aver;
    struct student *next;
};

struct student *create(void)//动态建造一个学生信息链表
{
    struct student *head,*p1,*p2;
    printf("请输入学生数据,当各项数据为零时,输入结束.\n");
    printf("请输入第 %d 个学生的数据:\n",n+1);
    p1 = (struct student *)malloc(LEN);
    scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
    while(p1->num != 0)
    {
        n = n+1;
        if(n == 1)head = p1;
        else p2->next = p1;
        p2 = p1;
        printf("请输入第 %d 个学生的数据:\n",n+1);
        p1 = (struct student *)malloc(LEN);
        scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
    }
    p2->next = NULL;
    return(head);
}


void average(struct student *ahead)//结构体中的 aver 成员是这函数求出并赋值,即平均分。
{
    struct student *p;
    p = ahead;
    if(ahead == NULL)printf("数据为空\n");
    do
    {
        p->aver = (p->score[0]+p->score[1]+p->score[2])/3;
        p = p->next;
    }while(p != NULL);
}

struct student *sort(struct student *s)//按平均分从小到大,对动态链表进行排序
{
}


void print(struct student *phead)//输出函数
{
    struct student *p;
    p = phead;
    if(phead == NULL)printf("数据为空\n");
    do
    {
        printf("学号 %d,姓名 %s,课目1分数 %5.2f,课目2分数 %5.2f,课目3分数 %5.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
        printf("%d 号同学的平均分是:%5.2f\n",p->num,p->aver);
        p = p->next;
    }while(p != NULL);
}

int main(void)
{
    FILE *fp;//定义一个文件类型指针
    struct student *pstu;//定义一个结构体类型指针
    pstu = create();//创建动态学生链表。
    printf("\n");
    average(pstu);//求平均分函数
    if((fp = fopen("stud","w")) == NULL)//以只写方式打开文件 stud。
    {
        printf("cannot open file\n");
        exit(0);
    }
    fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。
    fclose(fp);//关闭文件
    fp = fopen("stud","r");//打开文件 stud .
    fread(pstu,sizeof(struct student),1,fp);//把 fp 所指向的文件 stud 里的数据读入计算机内 pstu 所指向的内存地址上。
    print(pstu);//打印函数
    fclose(fp);//关闭文件
    sort(pstu);
    free(pstu);//释放动态空间。即pstu所指向的动态内存空间。
    getch();
    return 0;
}
/*
程序运行结果:
---------------------------------------------------------------------
请输入学生数据,当各项数据为零时,输入结束.
请输入第 1 个学生的数据:
101 yang1 88 69 79
请输入第 2 个学生的数据:
102 yang2 96 59 86
请输入第 3 个学生的数据:
103 yang3 90 90 93
请输入第 4 个学生的数据:
104 yang4 89 86 93
请输入第 5 个学生的数据:
105 yang5 91 93 96
请输入第 6 个学生的数据:
0 0 0 0 0

学号 101,姓名 yang1,课目1分数 88.00,课目2分数 69.00,课目3分数 79.00
101 号同学的平均分是:78.67
学号 102,姓名 yang2,课目1分数 96.00,课目2分数 59.00,课目3分数 86.00
102 号同学的平均分是:80.33
学号 103,姓名 yang3,课目1分数 90.00,课目2分数 90.00,课目3分数 93.00
103 号同学的平均分是:91.00
学号 104,姓名 yang4,课目1分数 89.00,课目2分数 86.00,课目3分数 93.00
104 号同学的平均分是:89.33
学号 105,姓名 yang5,课目1分数 91.00,课目2分数 93.00,课目3分数 96.00
105 号同学的平均分是:93.33
---------------------------------------------------------------------
*/
搜索更多相关主题的帖子: 计算机 结构体 如何 动态 
2015-12-04 16:18
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:2 
可以肯定的说,你的数据只写了一条进去,不信,你用记事本打开生成的stud看看。排序数组和链表一样。
2015-12-04 17:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
。。。

授人以渔,不授人以鱼。
2015-12-04 18:16
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 2楼 newdos
我是野路子,都自己在家看的。真不知道如何用记事本打开生成的文件。我的文件名是stud.我用记事本打不开。要到哪里找的。。。请教我。。。
2015-12-05 10:11
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 3楼 边小白
边大侠。你的意思是指把链表写入文件要把链表结点一个一个写入。读出的话也要一个一个结点的读出。就像用for()循环对静态链表写入、读出一样对吗?
2015-12-05 10:14
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:2 
以下是引用朔源在2015-12-5 10:11:23的发言:

我是野路子,都自己在家看的。真不知道如何用记事本打开生成的文件。我的文件名是stud.我用记事本打不开。要到哪里找的。。。请教我。。。


在电脑里搜索文件"stud"呀,你不会基本的电脑操作都不会吧?找到后拖动文件到记事本中,或是你的编程软件里,都可以打开的。

在家自学可以找本好点的书,看着你的代码,估计你看的书有点差劲。度娘c语言四书五经。
2015-12-05 11:02
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:2 
以下是引用朔源在2015-12-5 10:14:10的发言:

边大侠。你的意思是指把链表写入文件要把链表结点一个一个写入。读出的话也要一个一个结点的读出。就像用for()循环对静态链表写入、读出一样对吗?


那是肯定的,都一样。
2015-12-05 11:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 

授人以渔,不授人以鱼。
2015-12-05 13:33
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 8楼 newdos
按你说的找到文件了不过出来的是乱码,虽然是乱码,但确实只有一条数据。但乱码是什么原因?
2015-12-05 14:09
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:8 
以下是引用朔源在2015-12-5 14:09:43的发言:

按你说的找到文件了不过出来的是乱码,虽然是乱码,但确实只有一条数据。但乱码是什么原因?


你自己用二进制方式写进去的呗,当然乱码喽。要想看到,可以考虑用文本方式写文件,用fprintf输出,fscanf读出。
2015-12-05 14:23
快速回复:如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013267 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved