C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите быстро отредактировать длинную строку, Множественные исправления
V_a_d
Отправлено: 29.11.2004, 16:49


Ученик-кочегар

Группа: Участник
Сообщений: 4



Такая задача:
Имеем большой текст в строке (например, 1000000 символов). Надо после каждого 100-го символа вставить " перенос строки" и потом вывести в Memo или в RichEdit. И чтобы это было БЫСТРО!!! (до 3-х секунд).
Ваши предложения?
Konstantine
Отправлено: 29.11.2004, 17:43


Мастер участка

Группа: Модератор
Сообщений: 545



перечитывать блоками и вставлять в другой файл... ограничение — витчестер может не успеть... 2 мега разнотипных обращений в секунду...
Gedeon
Отправлено: 29.11.2004, 18:35


Ветеран

Группа: Модератор
Сообщений: 1742



Ну, мысль такая, ведь данные откуда-то попадают, вот при вставке эти переносы и ставить, дабы потом время не терять.
V_a_d
Отправлено: 29.11.2004, 18:52


Ученик-кочегар

Группа: Участник
Сообщений: 4



Re: Konstantine
По-моему, долговато... Можно считать, что данные находятся в строке AnsiString или *char (не суть), т.е. в опереативной памяти — наверное можно обойтись без нагрузки на винчестер.

Re: Gedeon
Текст попадает из файла. При считывании вставлять не целесообразно, так как в дальнейшем проводятся неоднократно такого типа операции (разного рода многочисленные вставки в исходный текст).
AVC
Отправлено: 30.11.2004, 09:07


Ветеран

Группа: Модератор
Сообщений: 1583



Захватить память под еще одну строку размером = размер_исходной_строки + (int(размер_исходной_строки / 100) + 1) * 2 + 1;
и через *char оперируя memset покрошить. Неужто на это уйдет более 3-х секунд?
Konstantine
Отправлено: 30.11.2004, 09:14


Мастер участка

Группа: Модератор
Сообщений: 545



ну если в char*, то создавай новый массим на 1020000 символов и ассемблерными вставками переноси по 100 символов и после них — 0х0D 0x0A... в ассемблере есть операции работы с блоками данных — вот их и используй
сколько выйдет времени не знаю, но ИМХО это самый быстрый способ
AVC
Отправлено: 30.11.2004, 09:18


Ветеран

Группа: Модератор
Сообщений: 1583



Вот и мне кажется, что это самый быстрый способ. Всегда так — либо память, либо время smile.gif
V_a_d
Отправлено: 30.11.2004, 20:47


Ученик-кочегар

Группа: Участник
Сообщений: 4



Сенкс! Я делаю тоже самое, только использую функцию sprintf() — результат удовлетворяет.
Вопрос: А можно как нибудь с помощью потоков?
Konstantine
Отправлено: 01.12.2004, 11:23


Мастер участка

Группа: Модератор
Сообщений: 545



а потоки куда прилепить собрался???
Boyko
Отправлено: 01.12.2004, 12:01


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Konstantine @ 01/12/2004, 11:25)
а потоки куда прилепить собрался???

Думаю что он говорит о TMemoryStream. Можно писать в TMemoryStream и потом SaveToFile().
V_a_d
Отправлено: 02.12.2004, 00:30


Ученик-кочегар

Группа: Участник
Сообщений: 4



QUOTE
Можно писать в TMemoryStream и потом SaveToFile().

Типа того.

Вернуться в Вопросы программирования в C++Builder