如何将嵌套的c struct数据保存到磁盘?

时间:2019-12-24 04:22:25

标签: c

我在c中嵌套了结构数据。 如何将_zend_op_array保存到文件?

struct _zend_op {
    const void *handler;
    znode_op op1;
    znode_op op2;
    znode_op result;
    uint32_t extended_value;
    uint32_t lineno;
    zend_uchar opcode;
    zend_uchar op1_type;
    zend_uchar op2_type;
    zend_uchar result_type;
};

struct _zend_op_array {
    /* Common elements */
    zend_uchar type;
    zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
    uint32_t fn_flags;
    zend_string *function_name;
    zend_class_entry *scope;
    zend_function *prototype;
    uint32_t num_args;
    uint32_t required_num_args;
    zend_arg_info *arg_info;
    /* END of common elements */

    int cache_size;     /* number of run_time_cache_slots * sizeof(void*) */
    int last_var;       /* number of CV variables */
    uint32_t T;         /* number of temporary variables */
    uint32_t last;      /* number of opcodes */

    zend_op *opcodes;
    ZEND_MAP_PTR_DEF(void **, run_time_cache);
    ZEND_MAP_PTR_DEF(HashTable *, static_variables_ptr);
    HashTable *static_variables;
    zend_string **vars; /* names of CV variables */

    uint32_t *refcount;

    int last_live_range;
    int last_try_catch;
    zend_live_range *live_range;
    zend_try_catch_element *try_catch_array;

    zend_string *filename;
    uint32_t line_start;
    uint32_t line_end;
    zend_string *doc_comment;

    int last_literal;
    zval *literals;

    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

1 个答案:

答案 0 :(得分:1)

您的结构很复杂,内部有许多指针。存储方法取决于数据元素。我将在这里给出一些一般性建议。

  • 如果您可以确保字段数始终恒定(例如arg_info的元素数已知),并且您的数据中不会包含分号(或者如果存在,则为分号)正确地转义),然后您可以定义某种CSV格式,并用分号分隔字段。

    • 您还需要先写数组中的元素数量,然后写数组元素。
    • 您将需要编写自己的函数以进行编码和解析。
  • 另一种方法是采用JSON或XML之类的结构化格式。也许您可以为此使用一些开源编码器和解析器。