0

我不确定为什么这个 glib 哈希表无法匹配键 - 我很想知道为什么。我读取了一个分隔文件并将其插入到哈希表中,它可以读取最后一个值,但不能读取第一个值或之前的任何值。

有什么帮助吗?

我正在阅读以下格式的文本文件:

001$002$Someval
and so on....

和代码:

FILE *f = fopen(DEFAULT_MSG_CODES, "r");

/* If file does not exist return 1 */
if (f == NULL) {
    return -1;
}

char *line;
char *token;
char *fields[8];
int i;
line = malloc(2048);

 GHashTable* hash = g_hash_table_new(g_str_hash, g_str_equal);

g_hash_table_insert(hash, "000", "test");

while (fgets(line, 2048, f) != NULL) {

    line[strlen(line) - 1] = '\0';
    i = 0;
    token = strtok(line, "$");

    while (token != NULL) {

        fields[i] = token;
        i++;
        token = strtok(NULL, "$");
    }

    printf("cid: %s eid: %s msg %s\n",fields[0],fields[1],fields[2]);
    g_hash_table_insert(hash,fields[0],fields[1]);

}

free(line);

fclose(f);

printf("There are %d keys in the hash\n", g_hash_table_size(hash));
printf("There is a match %s\n", g_hash_table_lookup(hash,"003"));
4

1 回答 1

1

如果我没记错的话,你会在循环的下一次迭代中通过linefgets. 一个简单的解决方法是在将字符串添加到哈希表之前strdup(或任何丑陋的 glib 名称)字符串。g_strdup但是你真的应该阅读这个 API 上的 glib 文档来找出你传入的数据的所有权契约,以及参数是否只是指向它将立即读取的数据的指针,或者指向将成为永久部分的对象的指针哈希表。

于 2012-08-10T00:17:30.687 回答