Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Поиск юникодных строк в файле


Автор: deber 28.2.2006, 18:14
Привет!

Пишу на ANSI C Другого не знаю smile Да и этот не особо smile

Помогите, плз.
Задача: Задается ASCII строка. Ее переделываем в UNICODE и ищем в заданном файле. Если строка найдена выводим "ОК".

Вроде все просто.
Строку, которую надо найти в файле, перевел в unicode.
Проблема с файлом, в котором надо найти эту строку.

Как правильно организовать поиск юникодной строки в файле?

Я пытался следующим образом: смотрел файл построчно и искал с помощью 'wcsstr', но у меня такое ощущение, что это не верно. Т.к. некоторые строки могут быть пропущены. smile

Мне советовали построить бинарное дерево и юзать его. Я в этом совсем ничего не понимаю.

smile совсем маленький

Автор: Romikgy 28.2.2006, 18:21
если файл небольшой , грузи весь в память и там ищи

Автор: _hunter 28.2.2006, 18:21
для несерьезного поиска вполне можеш и wcsstr использовать

Автор: deber 28.2.2006, 18:54
Проблема еще где-то у меня в коде.
Поэтому и прошу небольшой пример.

Допустим есть файл такого содержания:
Цитата

q w e r t y
qwerty


Первая строка юникодная, вторая ascii.
И если задам искать "qwerty", то моя прога выдаст результат, что найдено две строки.

Ниже кусок моей проги. smile

Вызываю так: strings_unicode(pf, what_find), где pf - указатель на открытый файл, what_find - искомая строка.
Ожидаю возвращения 0 или 1.

Код

int find_what_unicode(wchar_t *stringfile, char *what_find) {
    int result = 0;
    wchar_t  *pwcs;
    size_t   retval, n;
    (void)setlocale(LC_ALL,  "");
    errno  =  0;

    n = strlen(what_find) + 1;
    pwcs = (wchar_t *)malloc(n * sizeof(wchar_t));
    retval = mbstowcs(pwcs, what_find, n); /* ASCII -> UNICODE */
    if(retval == -1){
        printf("ERROR\n");
    } else {
        if (wcsstr(stringfile, pwcs) != NULL) {
            result = 1;
        }
    }
    return result;
}

int strings_unicode(FILE *pf, char *what_we_find) {
    static wchar_t printme[4*1024];
    int sz;
    unsigned char *cdata;
    wint_t nread;
    wint_t printmeindex;
    int result = 0;
    cdata = filebuf(pf,&sz);
    nread = fread(cdata, 1, sz, pf);
    printmeindex = 0;

    if (nread > 0) {
        int i;
        unsigned char c;
        int isprintable;
        int iseol;
        int count_find;
        count_find = 0;
        for (i = 0; i < nread; i++) {
            c = cdata[i];
            isprintable = isprint(c);
            iseol = 0;
            if (c == L'\n' || printmeindex >= sizeof(printme)-1) iseol = 1;
            if (iseol || !isprintable) {
                if (printmeindex > 3 && iseol) {
                    printme[printmeindex++] = 0;
                    if (find_what_unicode(printme, what_we_find)) {
                        result = 1;
                    }
                    printmeindex = 0;
                }
         } else if (isprintable) {
                printme[printmeindex++] = c;
         }
        } /*End for()*/
    } /*End if()*/
    if (printmeindex > 3) {
        printme[printmeindex++] = 0;
        if (find_what_unicode(printme, what_we_find)) {
            result = 1;
        }
        printmeindex = 0;
    }
    free(cdata);
    return result;
}

Автор: deber 1.3.2006, 13:26
smile Неужели никто не сталкивался с подобным?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)