免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7703 | 回复: 7
打印 上一主题 下一主题

请教链表的文件储存方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-19 17:03 |只看该作者 |倒序浏览
最近老师要求我们做一个管理系统,要求能够存盘和读取,我想用链表做,但却不知道怎么将链表存盘和读取,请前辈写出一段代码教我如何做到存盘和读取例如我定义一个类
class Vector
{
double x,y;
Vector *next;
}
就是这样创建一段链表,该如何存盘读取呢,求指教

论坛徽章:
0
2 [报告]
发表于 2010-06-19 18:47 |只看该作者
回复 1# oydhc


    只存数据部分不就可以了吗?按照顺序,读取时候再按着顺序一个一个插入到新建的链表不就可以了

论坛徽章:
0
3 [报告]
发表于 2010-06-19 19:38 |只看该作者
回复 1# oydhc

将链存到文件, 感觉是件很危险的事情。一不小心关机,链就断了,。。。,要做日志,保证能回滚
    c的大概是这样:
typedef enum {
    INSERT,
    DELETE,
    RESTORE,
}vecop_t;

typedef struct veclog_s{
    vecop_t op;
    int64_t logoffset[4];
    double data[2];
    crc32_t crc;
    int32_t iscommit;
}veclog_t;
typedef struct vec_s {
    double x,y;
    int64_t offset;
}vec_t;

typdef struct vecmeta_s{
    int64_t ___magic;
    int64_t first_elem;
    int64_t lash_elem;
    int64_t tota_elem
    int64_t dirty;
    int32_t lognum;
    int32_t pad
    veclog_t log[LOG_SIZE];
}vecmeta_t;
磁盘结构大概这样?

内存结构:

pack(
typedef struct vec_s{
    int fd;
    vecmeta_t meta;
    struct list_head elemlist;
    struct list_head loglist;
    vec_insert   insert;
    vec_delete  delete;
    vec_flush     flush;
    vec_pack     pack;
    vec_init        init;   
}vec_t;


flush (){
    /*设置脏位*/

    /*写日志*/

    /*写文件*/
   
    /*设置日志提交位*/
   
    /*写crc/

    /*恢复脏位*/   
}

init () {
    /*如果日志为脏,检查最近的一个为提交的日志*/
    /*如果crc正确, 重新尝试做操作*/
    /*否则, 常识恢复以前的状态。*/
}

插入,删除数据的时候, 不实际删除数据,只修改offset;append到末尾

以插入为例子, 日志如下:

OP INSERT
OFFSET0   //在OFFSET 0后插入
OFFSET1   //OFFSET的下一个元素是 OFFSET1
OFFSET2   //要插入的元素位于OFFSET2;
data[2]     //要插入的数据

如果发生错误, 比如系统崩溃, 则需要恢复原来的链。恢复连, 也要做日志。以防止恢复过程中再次崩溃。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-06-19 22:47 |只看该作者
用二楼的方法就行了,反正只是个练习

论坛徽章:
0
5 [报告]
发表于 2010-06-20 07:35 |只看该作者
CREATE DATABASE db;
USE db;
CREATE TABLE Vector (
        id INT PRIMARY KEY AUTO_INCREMENT,
        x REAL,
        y REAL
);
INSERT INTO Vector(x, y) VALUES(1.0, 2.0);
INSERT INTO Vector(x, y) VALUES (-1.1, 9.08);

论坛徽章:
0
6 [报告]
发表于 2010-06-20 09:52 |只看该作者
支持2楼。

不然你就用数据库吧。

论坛徽章:
0
7 [报告]
发表于 2010-06-20 17:11 |只看该作者
可以存储到文件,不过从文件中取出来数据以后,还是要自己一个一个节点组成链表
我以前就这么干过

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
8 [报告]
发表于 2010-06-20 17:24 |只看该作者
好多文件系统中的文件存储方式都是链表方式的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP