2011-01-02 4 views
0

Я новичок в языке c, поэтому я буду признателен за каждую помощь: D Мне нужно сравнить данные слова в первом файле (" Albert\n Martin\n Bob") со словами во втором файле (" Albert\n Randy\n Martin\n Ohio"). Когда бы они ни были одинаковыми, мне нужно положить в файл слово «Язык»; и печатать каждое слово без представления во втором файле " -то вроде: языка языка БобСравнение строк в двух файлах в C;

нужно, чтобы быть в третьем файле,

Я пытался придумать какие-нибудь идеи, но они не работают ; стр.,

Спасибо за каждый anwser заранее

+3

Покажите нам некоторый код. У тебя есть? – Muggen

+3

Какие у вас были идеи и как они потерпели неудачу? –

+0

Как выглядят ваши файлы? Имеют ли они какие-либо разделители? Пожалуйста, добавьте как можно больше дополнительной информации, чтобы мы могли помочь вам. –

ответ

1

во-первых, вам нужно open a stream читать файлы

.

Если вам нужно сделать это на C, вы можете использовать функцию strcmp. Он позволяет сравнивать две строки.

Например:

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

Я бы открыть все три файла, чтобы начать с (оба входных файлов и выходного файла). Если вы не можете открыть их все, то вы не можете сделать ничего полезного (кроме отображения сообщения об ошибке или чего-то еще); и нет смысла тратить время процессора только на то, чтобы узнать, что (например,) вы не можете открыть выходной файл позже. Это также может помочь уменьшить условия гонки (например, во втором изменении файла во время обработки первого файла).

Затем начните обработку первого файла. Разделите его на слова/маркеры, когда вы его прочитали, и для каждого слова/токена вычислите значение хэша. Затем используйте значение хэша и само слово/токен, чтобы проверить, является ли новое слово/токен дубликат предыдущего (уже известного) слова/токена. Если это не дубликат, выделите некоторую память и создайте новую запись для слова/токена и вставьте запись в связанный список, соответствующий хэшу.

Наконец, обработайте второй файл. Это похоже на то, как вы обработали первый файл (разбить его на слова/токены, вычислить хеш, использовать хеш, чтобы узнать, известно ли слово/токен), кроме случаев, когда слово/токен неизвестно, вы его пишете к выходному файлу, и, если известно, вы вместо этого записываете «язык» в выходной файл.

Если вы не знакомы с хэш-таблицами, они довольно просты. Для простого метода (не обязательно лучший метод) вычисления значения хэш-функции для 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 увеличивают объем памяти, который вы используете немного (и уменьшаете вероятность того, что разные слова имеют одинаковый хеш).

Не забудьте закрыть свои файлы, когда закончите с ними. Освобождение памяти, которую вы использовали, является хорошей идеей, если после этого вы сделаете что-то еще (но если после этого вы ничего не сделаете, быстрее и проще «выйти()» и позволить очистке ОС).

Смежные вопросы