![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
lonevagrant |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Здравствуйте. Меня постигла проблема.
Есть текст в нем макросы типо:
В тексте могут быть еще макросы разнообразн. Суть как будет наиболее быстродейственные заменить макросы. Только средствами стандартн. библ. С++, без регексов. Делал так: 1. Читал в буффер файл. 2. Создал структуру, затем функция проганяла весь буффер, на просмотр макросов весли такой есть, пишим в структуру. 3. И вот тут загвоздка, проганяя весь буффер в цыкле я проверял если мы на "[", затем плюсовал счетчику цикла +1. Вот пример:
Есть ряд недостатков, скорость, кажен макрос должен быть с новой заглавной буквой, либо еще придется делать конструкцию if(){}. Подскажите более оптимальный способ. Спасибо! |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
можешь использовать алгоритм быстрого нахождения подстрок
в твоём случае подстроки - это [ТЕГИ] довольно быстро работает алгоритм QuickSearch и он прост в реализации. после того, как позиции тегов найдены - замени их нужными тебе значениями. |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
как вариант читать постепенно и записывать в выходной поток, при встрече макросов - заменять. что-то вроде
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ещё если текст большой, то его лучше обрабатывать построчно. Т.е. разделить сначала на строки, обработать строки, а потом соединить.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
lonevagrant |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
тут опять нужно будет строить конструкцию if(){}. нужно определить какой именно макрос, если я правильно понял это код будет действительным если все макросы нужно заменить одним словом.
Не понял это строку, гугл ничего не сказал о "readtoken", до какого символа он будет читать. (обьясните пожалуйста.) P.S - текст от 6 кб до 50кб. |
||||||
|
|||||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
ну и что? if'ы, как и regexp, тоже нельзя применять? |
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Просто хотел узнать, чем он будет ефективн. моего способа.
P.S - так и не нашел функцию "readtoken", мб плохо искал, тыкние ссылку. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Используй std::map вместо пачки if'ов
|
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
lonevagrant, readtoken тебе придется написать самому
![]() лучше твоего варианта тем, что не надо выделять память под считывание всего файла + не надо искать макросы по тексту, так как они найдутся в процессе чтения. нет ты понял не правильно, функция getreplacement (которую тебе так же предстоит написать) выдает подстановку по считанному макросу. никто не запрещает ей выдавать разные подстановки для разных макросов или даже разные подстановки для одного и того макроса ![]() чем тебя смутил if я так и не понял. можно и без if
![]() Это сообщение отредактировал(а) 17dufa - 20.1.2010, 14:01 |
|||
|
||||
lonevagrant |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
да if-ы меня не смущают. Просто еще нужно будет определить что за макрос там или то [NAME] или [AGE] или [COUNTRY] или еще окло 10.
![]() Вот этот код нужно повторять еще около 10 раз. А запись в структуру производит. для того что бы лишний раз не делать проверку макроса если его нету в тексте. |
||||||
|
|||||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
lonevagrant, ты что-то конкретно путаешь. не надо внутри while дублировать функционал readtoken и getreplacement.
readtoken тебе вернет например "NAME". ты этот "NAME" передашь getreplacement. она тебе вернет например строку "lonevagrant", которую ты в выходной поток и запишешь. |
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Я не пойму как тут будет идти проверка какой макрос вернул "readtoken(inputstream)".
Мне нужно на место макросов вставлять свои данные.
Как будет идти проверка на макросы?) |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
ты конкретно не понимаешь моего предложения. еще раз - функция getreplacement принимает макрос и возвращает его подстановку. если входное значение "NAME" она вернет "Маша", если входное значение "AGE" она вернет "17". то есть, все эти if, которые ты нарисовал внутри while на самом деле живут в функции getreplacement. Вот в том коде, что ты привел - какой смысл ты вкладываешь в функцию getreplacement? Что она у тебя делает? Хотя я бы реализовывал getreplacement не через if а как поиск по таблице, в таблице 2 столбца - макрос и значение, которым этот макрос нужно заменить, логически таблица выглядела бы так:
"NAME" | "Маша" "AGE" | "17" ... |
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Вроде вьехал.
Попробую реализовать. Если есть еще варианты послушаю с радостью. Спасибо всем. Отдельное спасибо 17dufa Это сообщение отредактировал(а) lonevagrant - 20.1.2010, 15:50 |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
да. именно за этим макрос передается в функцию как параметр.
|
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Извиняюсь за АП темы.
Вроде все ясно, но readtoken(inputstream);- натолкни как можно реализовать эту функцию. спс. |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
вроде так |
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Если я правильно понял.
Мы начинаем читать с начала файла, а не с того места где мы нашли '['. И еще ожно этот "istream" использует буфферезацию файла, или нет. Это сообщение отредактировал(а) lonevagrant - 21.1.2010, 13:56 |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
lonevagrant, слова читаю, а вот смысла понять не могу. перефразируешь?
|
|||
|
||||
lonevagrant |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
В это куске кода мы ище '[', затем когда мы нашли '[' мы вызываем функцию " readtoken(inputstream);"
Тут вопрос, этот кусок функции начинает читать откуда, с начала файла, или же с "[". |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
xvr +1
|
|||
|
||||
lonevagrant |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 2.7.2009 Репутация: нет Всего: нет |
Соррь за АП.
Все вродь понятно, да и получается все. Только вот загвозка в том что все пробелы в тексте затираются, пробел в потоке означает его окончан., но как можно это предовратить. Просто текст получается нечитабелен. Спасибо! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |