Поиск строки в текстовом файле C

При использовании Active Directory, у Вас мог бы быть каждый AD использования приложения для аутентификации, вход в систему мог бы тогда быть бесшовным.

Иначе, если приложения могут говорить друг с другом негласно, Вы могли бы использовать sessionids и иметь одно приложение, обрабатывающее идентификационное поколение, вручающее все Ваши другие приложения.

5
задан GManNickG 26 October 2009 в 22:50
поделиться

4 ответа

Я предполагаю, что это обучающее упражнение, и вы просто ищете место для начала. В противном случае вам не следует изобретать велосипед.

Приведенный ниже код должен дать вам представление о том, что происходит. Это программа, которая позволяет вам указать имя файла для поиска и один аргумент для поиска в этом файле. Вы должны иметь возможность изменить это, чтобы поместить фразы для поиска в массив строк и проверить, появляются ли какие-либо слова в этом массиве в любой из прочитанных строк.

Ключевая функция, которую вы ищете, - ] strstr .

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifdef DEBUG
#define INITIAL_ALLOC 2
#else
#define INITIAL_ALLOC 512
#endif

char *
read_line(FILE *fin) {
    char *buffer;
    char *tmp;
    int read_chars = 0;
    int bufsize = INITIAL_ALLOC;
    char *line = malloc(bufsize);

    if ( !line ) {
        return NULL;
    }

    buffer = line;

    while ( fgets(buffer, bufsize - read_chars, fin) ) {
        read_chars = strlen(line);

        if ( line[read_chars - 1] == '\n' ) {
            line[read_chars - 1] = '\0';
            return line;
        }

        else {
            bufsize = 2 * bufsize;
            tmp = realloc(line, bufsize);
            if ( tmp ) {
                line = tmp;
                buffer = line + read_chars;
            }
            else {
                free(line);
                return NULL;
            }
        }
    }
    return NULL;
}

int
main(int argc, char *argv[]) {
    FILE *fin;
    char *line;

    if ( argc != 3 ) {
        return EXIT_FAILURE;
    }

    fin = fopen(argv[1], "r");

    if ( fin ) {
        while ( line = read_line(fin) ) {
            if ( strstr(line, argv[2]) ){
                fprintf(stdout, "%s\n", line);
            }
            free(line);
        }
    }

    fclose(fin);
    return 0;
}

Пример вывода:

E:\Temp> searcher.exe searcher.c char
char *
    char *buffer;
    char *tmp;
    int read_chars = 0;
    char *line = malloc(bufsize);
    while ( fgets(buffer, bufsize - read_chars, fin) ) {
        read_chars = strlen(line);
        if ( line[read_chars - 1] == '\n' ) {
            line[read_chars - 1] = '\0';
                buffer = line + read_chars;
main(int argc, char *argv[]) {
    char *line;
9
ответ дан 18 December 2019 в 09:50
поделиться

Чтение по блокам всегда лучше, потому что так работает базовая файловая система.

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

Если этого тривиального алгоритма недостаточно (в вашем случае он, вероятно, есть), там гораздо более сложный алгоритм для поиска одновременно нескольких подстрок в одном буфере cf Rabin-Karp .

2
ответ дан 18 December 2019 в 09:50
поделиться
cat strings.txt |while read x; do grep "$x" text_file.txt; done
2
ответ дан 18 December 2019 в 09:50
поделиться

Помните: все функции fgetc (), getc (), getchar () возвращают целое число, а не символ. Целое число может быть EOF или допустимым символом, но оно возвращает на одно значение больше, чем диапазон, поддерживаемый типом char.

Вы пишете суррогат для команды 'fgrep':

fgrep -f strings.txt text_file.txt > out.txt

Вместо того, чтобы читать символы, вы нужно будет читать строки - используя fgets (). (Забудьте о существовании функции gets ()!)

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

Вероятно, вам потребуется использовать динамическое размещение для списка строк. Простой поиск просто применит 'strstr ()' для поиска каждой из требуемых строк в каждой строке ввода (не забудьте разорвать цикл, как только вы найдете совпадение, чтобы строка не повторялась, если есть несколько совпадений в одной строке).

Более сложный поиск должен предварительно вычислить, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

Возможно, вам потребуется использовать динамическое размещение для списка строк. Простой поиск просто применит 'strstr ()' для поиска каждой из требуемых строк в каждой строке ввода (не забудьте разорвать цикл, как только вы найдете совпадение, чтобы строка не повторялась, если есть несколько совпадений в одной строке).

Более сложный поиск должен предварительно вычислить, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

Возможно, вам потребуется использовать динамическое размещение для списка строк. Простой поиск просто применит 'strstr ()' для поиска каждой из требуемых строк в каждой строке ввода (не забудьте разорвать цикл, как только вы найдете совпадение, чтобы строка не повторялась, если есть несколько совпадений в одной строке).

Более сложный поиск должен предварительно вычислить, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

поиск каждой из требуемых строк в каждой строке ввода (не забудьте разорвать цикл, как только вы нашли совпадение, чтобы строка не повторялась, если в одной строке есть несколько совпадений).

Более сложный поиск будет предварительно вычислять, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

поиск каждой из требуемых строк в каждой строке ввода (не забудьте разорвать цикл, как только вы нашли совпадение, чтобы строка не повторялась, если в одной строке есть несколько совпадений).

Более сложный поиск будет предварительно вычислять, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

Более сложный поиск должен предварительно вычислить, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

Более сложный поиск должен предварительно вычислить, какие символы можно игнорировать, чтобы вы могли искать все строки параллельно, пропуская текст быстрее, чем цикл в цикле. Это может быть модификация алгоритма поиска, такого как Бойер-Мур или Кнут-Моррис-Пратт ( добавлено : ​​или Рабина-Карпа, который разработан для параллельного поиска нескольких строк).

4
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: