2012-08-09 18 views
0

我不知道爲什麼這個glib哈希表無法匹配鍵 - 我很想知道爲什麼。我讀取分隔文件並將其插入散列表中,它可以讀取最後一個值,但不是第一個或之前的值。循環插入後C 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")); 

回答

1

如果我沒有記錯的話,你重挫你投入的數據哈希表通過覆蓋line並重新調用fgets來重複下一次迭代。在將這些字符串添加到散列表之前,一個簡單的修復方法是strdup(或g_strdup或任何醜陋的glib名稱)。但是你應該真的閱讀關於這個API的glib文檔,以找出你傳入的數據的所有權契約,以及參數是指向它將立即讀取的數據的指針,還是指向將成爲永久性部分的對象的指針哈希表。

+0

您的正確 - 我認爲這是類似的東西,但我從來沒有使用過,直到那時。 – mcdoomington 2012-08-10 17:01:57