代码之家  ›  专栏  ›  技术社区  ›  bua

链表内存转储结构

  •  0
  • bua  · 技术社区  · 16 年前

    有没有什么标准的方法,我在学校错过了甩C 嵌套链表结构 以合理的方式在磁盘上? 我不想做的是:

    • 使用协议缓冲区或其他类似的序列化程序,

    • 分配准确的内存量(或扩展现有的内存量)并自行管理,使用一些附加字段以堆栈方式放置列表元素来管理相对地址。必要时在磁盘上转储块。有从磁盘映射块的过程可以创建理想的结构,并知道字节顺序。
    • 将主结构推入文件,然后推入列表元素,将有关列表的信息存储在文件头中。

    为了更好地理解这一点,我将给出一些更详细的示例代码:

    typedef struct{
       int b;
       List *next;
    }List;
    
    typedef struct{
       float b;
       List2 *next;
    }List2;
    
    typedef struct{
       List *head;
       List *tail;
    } info;
    
    typedef struct{
       List2 *head;
       List2 *tail;
    } info2;
    
    struct data
    {
        int a;
        char t[10];
        info first;
        info second;
        info2 third;
    };
    

    干杯 第。

    编辑:

    我已经扩展了主结构,似乎上一个还没有完全指出问题所在。 允许使用想法和伪代码。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Matt Joiner    16 年前

    将数据按其在链表中的顺序序列化,记录样式为文件。 fwrite 特别适合这个。一定要取消对指针的引用,并注意endianness在其中扮演的角色。

    List *list_new();
    List *list_add(List *, void *data);
    List *list_next(List *);
    
    while (node) {
        fwrite(node->data, sizeof(node->data), 1, fp);
        node = list_next(node);
    }
    

    读取实时列表的粗略代码:

    List *node = list_new();
    while (true) {
        struct data *buf = malloc(sizeof(*buf));
        if (1 != fread(buf, sizeof(*buf), 1, fp))
            break;
        list_add(node, buf);
    }
    

    更新0

    如果开始嵌套更高级的结构,如其他链表、可变长度字符串等,则需要为每个记录提供类型和长度,以及在其他记录中嵌套记录的方法。

    \0 对于字符串(一个明显的选择),以及结构数据的零块。

        2
  •  2
  •   Saurabh    16 年前

    我没有正确理解您的问题,但是将结构转储到磁盘并可靠地读回它有多个问题。

    最重要的是结构填充或字节填充。所以你也得处理好。

        3
  •  1
  •   t0mm13b    16 年前

    struct rwBufferData{
        int a;
        char t[10];
    };
    

    并在写入前使用 memset memmove

    struct rwBufferData rwBuf;
    struct data *dataPtr;
    memset(&rwBuf, '\0', sizeof(struct rwBufferData));
    memmove(&rwBuf, dataPtr, sizeof(struct rwBufferData));
    

    现在你可以写了 rwBuf