Сравнение строк в двух файлах в C; - PullRequest
0 голосов
/ 02 января 2011

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

должен быть в моем третьем файле;

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

Заранее благодарим за каждый ответ.

Ответы [ 2 ]

1 голос
/ 02 января 2011

Во-первых, вам нужно открыть поток для чтения файлов.

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

Например:

int strcmp(const char *s1, const char *s2);
0 голосов
/ 03 января 2011

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

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

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

Если вы не знакомы с хеш-таблицами, это довольно просто.Для простого (не обязательно лучшего) метода вычисления значения хеш-функции для ASCII / text вы можете сделать что-то вроде:

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

Тогда у вас есть массив связанных списков, например, "INDEX_ENTRY * index [HASH_SIZE] ", который содержит указатель на первую запись для каждого связанного списка (или NULL, если связанный список для хэша пуст).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...