Вопрос № 41422: Добрый день, уважаемые эксперты.
Такая задача:
Прочитал файл формата .rtf в buffer.
Далее необходимо очиститься от тегов, к примеру:
необходимо в тексте найти {
ov} и заменить на 13h,10h И т.д.
Как осуществить заме...
Вопрос № 41.422
Добрый день, уважаемые эксперты.
Такая задача:
Прочитал файл формата .rtf в buffer.
Далее необходимо очиститься от тегов, к примеру:
необходимо в тексте найти {
ov} и заменить на 13h,10h И т.д.
Отвечает: Пан Павел Константинович
Здравствуйте, Савенок Валентин Николаевич!
> Как осуществить замену в текcте??
>> Интересный вопрос, а самой главное как эту задачу? решают профи. из Microsoft, давайте анализировать имеющиеся у нас данные.
Инструменты для анализа ситуации:
1. Блокнот.exe(входит в поставку ОС Windows)
2. Hiew.exe(16-ый редактор)
3. Листочик формата А-4 и карандаш.
Давайте создадим файл LAB.TXT и напечатаем в этом фйале строку 001122. Теперь откроем этот файл из Hiew.exe, после открытия этого файла мы видим 16 -ую последовательность типа 30-30-31-31-32-32, того размер файла 6 байт. Блокнот.ехе имеет фун-ию замены(Правка -> Заменить), давайте заменим 11 на пустую строку и сохраним наш подопотный файл, затем откроем его через Hiew.exe что получим? получим 0022, это означает то что фун-ия замены просто передвинула 22 на место 11 тем самым затерев 11 НО! вы скажете что
передвижение байт это простое копирование и правильно скажете тем самым мы должны получить не 0022, а 002222, так оно бы и было если бы фун-ия замены не сохраняла колл-во замененых байт, тем самым сообщая что Блокноту.ехе надо сохранить данные из буфера в файл, только 4 байта, а не 6 байт, что он и делает.
Вывод опыта:
1. Замена на пустую строку - это простое перетаскивание "Хвоста" к началу файла на L - ое колл-во байт, где L определяется длинной заменяемой строки. А так же сохранение байт в файл из буфера колл-во которых, определяется как N = M - T, где M - общее изначальное колл-во байт т.е. до момента замены, а T = L * F, F - колл-во блоков которые будут заменены.
2. Замена на пустую строку - это не замена блоков на спец. символы которые дают эфект токо, что замененые симолы удалились.
Например:
00XX22, где X - спец. управляющий или спец. символ.
А что касается замены символа на символ, то здесь картина такова:
1. Вы сканируете буфер на наличие флага он же '/' или '<' или '['
2. Если ситуация после сканирования одназначна т.е. наличие '/' 100% говорит о том что мы имеем дело с тегом то далаем замену.
3. Замена должна осущ-ся. так чтобы заменяемый блок был полностью заполнен байтами замены иначе будет абра-кадабра.
Предложение:
Делайте это всё на языке высокого уровны типа С, С++, Perl, PHP.
Perl, PHP - надо выделить особо.
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 6-ой класс)
Ответ отправлен: 27.04.2006, 13:37 Оценка за ответ: 3 Комментарий оценки: Яву-это хорошо, но вопрос конкретный и в конкретный раздел рассылки.
Замену именно в тексте легко сделать, так как строка "13h,10h" размером не больше заменяемой "{
ov}". Во общем случае это делаеться с помощью конечных автоматов (см. пример)...
Приложение:
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 27.04.2006, 15:19 Оценка за ответ: 4 Комментарий оценки: Ответ хороший, спасибо. Пример немножко недоработан.