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

私が間違っていなければ、ループの次の反復でハッシュテーブルに入れたデータを、へlineの新しい呼び出しで上書きすることによって壊滅させていることになりfgetsます。簡単な修正は、文字列をハッシュテーブルに追加する前に、文字列strdup(またはg_strdupその醜いglib名)を修正することです。ただし、このAPIのglibドキュメントを実際に読んで、渡すデータの所有権契約を確認し、引数がすぐに読み取るデータへのポインターなのか、永続的な部分になるオブジェクトへのポインターなのかを確認する必要があります。ハッシュ表。

于 2012-08-10T00:17:30.687 に答える