Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск юникодных строк в файле 
:(
    Опции темы
deber
  Дата 28.2.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



Привет!

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

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

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

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

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

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

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

Это сообщение отредактировал(а) deber - 28.2.2006, 18:14
PM MAIL   Вверх
Romikgy
Дата 28.2.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



если файл небольшой , грузи весь в память и там ищи


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 28.2.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



для несерьезного поиска вполне можеш и wcsstr использовать


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
deber
Дата 28.2.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



Проблема еще где-то у меня в коде.
Поэтому и прошу небольшой пример.

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

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;
}

PM MAIL   Вверх
deber
Дата 1.3.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



smile Неужели никто не сталкивался с подобным?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.