2011-01-02 19 views
0

私は言語Cに新しいので、すべての助けを感謝します:D 最初のファイル(" Albert\n Martin\n Bob")の指定された単語と2番目のファイル(" Albert\n Randy\n Martin\n Ohio")の単語を比較する必要があります。 彼らが同じであれば、私はファイルの単語 "言語"を入れる必要があります。第二のファイルで表現せずに印刷すべての単語を「 そのような何か: 言語 言語 ボブCの2つのファイルの文字列を比較します。

私の3番目のファイルである必要の;

は、私はいくつかのアイデアを思い付くしようとしたが、彼らはいけない仕事; P、事前にすべてのanwserのため

感謝を

+3

私たちにいくつかのコードを見せてください。あなたは何か? – Muggen

+3

どのようなアイデアがありましたか?どのように失敗しましたか? –

+0

ファイルはどのように見えますか?それらには区切り記号が含まれていますか?できるだけ多くの追加情報を追加してください。 –

答えて

1

まず、あなたはファイルを読むためにopen a streamに必要

Cでこれを行う必要がある場合は、strcmp関数を使用することができます。 2つの文字列を比較することができます。例えば

int strcmp(const char *s1, const char *s2); 
0

私は(入力ファイルと出力ファイルの両方)を開始するために、すべての3つのファイルを開くと思います。それらのすべてを開くことができない場合は、何か有用なことはできません(エラーメッセージなどを表示する以外)。 CPU時間を浪費することなく、後で出力ファイルを開くことができます。これは、競合状態(たとえば、最初のファイルを処理している間の2番目のファイルの変更)を減らすのにも役立ちます。

次に、最初のファイルの処理を開始します。それを読んで単語/トークンに分解し、各単語/トークンに対してハッシュ値を計算します。次に、ハッシュ値と単語/トークン自体を使用して、新しい単語/トークンが以前の(既知の)単語/トークンの複製であるかどうかを確認します。重複していない場合は、メモリを割り当てて、単語/トークンの新しいエントリを作成し、ハッシュに対応するリンクリストにエントリを挿入します。

最後に、2番目のファイルを処理します。これは、単語/トークンが分からない場合を除いて、最初のファイルを処理した方法(単語/トークンに分解し、ハッシュを計算し、ハッシュを使用して単語/トークンが分かっているかどうかを調べる方法)と似ています出力ファイルに "language"を書き出します。

ハッシュテーブルに精通していない場合は、かなり簡単です。あなたのような何かができるASCII /テキストのハッシュ値を計算する簡単な方法(必要はない最良の方法)の場合:

その後
hash = 0; 
while(*src != 0) { 
    hash = hash^(hash << 5)^*src; 
    src++; 
} 
hash = hash % HASH_SIZE; 

あなたはINDEX_ENTRY」のようなリンクリストの配列を、持っている*インデックス[HASH_SIZE]各リンクされたリストの最初のエントリへのポインタ(ハッシュのリンクリストが空の場合はNULL)を含みます。

検索するには、正しいリンクリストの最初のエントリを検索するためにハッシュを使い、次にリンクリストの各エントリに対して "strcmp()"を実行します。例は次のようになります。

INDEX_ENTRY *find_entry(uint32_t hash, char *new_word) { 
    INDEX_ENTRY *entry; 

    entry = index[hash]; 
    while(entry != NULL) { 
     if(strcmp(new_word, entry->word) == 0) return entry; 
     entry = entry->next; 
    } 
    return NULL; 
} 

このすべてのアイデアは、パフォーマンスを向上させることです。たとえば、両方のファイルが1024ワードの場合(ハッシュテーブルなし)、 "strcmp()"を1024 * 1024回実行する必要があります。 "#define HASH_SIZE 1024"というハッシュテーブルを使用すると、おそらくそれを約2000倍に減らすことができます(そして、はるかに高速なコードで終わります)。HASH_SIZEの値を大きくすると、使用するメモリ量が少し増えます(同じハッシュを持つ異なる単語の可能性が減ります)。

ファイルの終了時にファイルを閉じることを忘れないでください。あなたがこの後に何か他のことをするなら、あなたが使ったメモリを解放することは良いアイデアです(しかし、この後に何もしなければ、 "exit()"してOSをクリーンアップする方が速くて簡単です)。