c - 如何遍历文本,将文件中的数据读入 c 中的多个变量?

标签 c pointers scanf

我意识到这听起来像是一个重复的问题,它可能是,但我已经找了几天了。我搞砸的代码是这样的:

node* deSerialize(FILE *fp) {
    char key[20];
    char value[MAXSIZE];
    node *n = NULL;
    while (fscanf(fp, " %[^*]*%[^*]* ",key,value)==2) {
        if (n) {
            n = add_node(n,key,value);
        }
        else{
            n = new_node(key,value);
        }
    }
    return n;
}

但是当我将反序列化的结构保存回磁盘时,它只保存最后一个键/值。像这样:

test*value* test*value* test*value* test*value* test*value* test*value* test*value* test*value*

序列化后的结构是这样的:

key1*value1* key2*value2* key3*value3* key4*value4* key5*value5* key6*value6* key7*value7* test*value*

我知道字符串指针(或数组指针,不知道真正叫什么)keyvalue 正在更新,因此它们都指向同一个事情到底发生了什么,但我该如何防止呢?

为了完整起见,这里是其他涉及的函数:

void serialize(FILE *fp, node *n) {
    node *j = n;
    while (j) {
        while(j->left) {
            serialize(fp,j->left);
            j->left=NULL;
        }
        while(j->right) {
            serialize(fp,j->right);
            j->right=NULL;
        }

        fprintf(fp,"%s*%s* ",j->key,j->value);
        j=NULL;
    }
}

node* new_node(char *key, char *value) {
    struct node* result = malloc(sizeof(struct node));
    memset(result, 0, sizeof(struct node));
    result->key = key;
    result->hash = hash(key);
    result->value = value;
    result->left = result->right = NULL;
    return result;
}

node* add_node(node* tree, char *key, char *value ) {
    unsigned long h = hash(key);
    if (tree==NULL)
        tree=new_node(key,value);
    if (h<tree->hash)
        tree->left = add_node(tree->left,key,value);
    if (h>tree->hash)
        tree->right = add_node(tree->right,key,value);
    return tree;
}

最佳答案

您将希望为结构中的重复字符串动态分配内存。目前,您覆盖了之前的数据,因为所有节点都引用同一个数组。

不过,您不想创建一个二维数组,因为从您的函数返回时,您的节点将引用堆栈上已经清理过的内存。 (本地数组放在堆栈上,并在函数返回时被移除。)执行此操作的正确方法是使用动态内存分配。

这是一种使用动态分配保存数据的方法:

node* new_node(char *key, char *value) {
    struct node* result = malloc(sizeof(struct node));
    memset(result, 0, sizeof(struct node));

    result->key = strdup(key); //DUPLICATE STRING

    result->hash = hash(key);
    result->value = value;
    result->left = result->right = NULL;
    return result;
}

您不必事先知道字符串的大小。此外,您还需要通过实现 destroy_node() 函数来free() 分配的内存:

void destroy_node(node *n) {
    if (n != NULL) {
        free(n->key);
        free(n);
    }
}

关于c - 如何遍历文本,将文件中的数据读入 c 中的多个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894667/

相关文章:

c++ - 没有结构对象的 C 指针算术

c - fscanf 不扫描空格后的行

C-这段代码有什么问题?我尝试在 func 中将一个矩阵乘以另一个矩阵并获得新矩阵,但出现段错误

c - 来自不相关 block 的指针的比较(>,> =,<,<=)

c - 附加两个字符串

c - 指针递增与指针递增

C Scanf 命令无法运行

c - 如果有人提示 gets(),为什么不对 scanf ("%s"做同样的事情,...)?

用 C 创建计算器

c - 改进 Windows 应用程序中的堆内存使用情况报告