Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

разделить строку


Страницы:   1 2

cross ©   (2010-12-28 12:21:00) 

как быстро разделить строку на подстроки по 2048 символов?

вот мой вариант:


var
 S: string;
 N, I: Integer;
 SL: TStrings;
begin
 SL := TStringList.Create;
 try
   N := 1;
   for I := 1 to length(S) do
   begin
     if I mod 2048 = 0 then
     begin
       SL.Add(Copy(S, N, I));
       Inc(N, 2048);
     end;
   end
   ShowMessage(SL.Text);
 finally
   SL.Free;
 end;
end;


Dennis I. Komarov   (2010-12-28 14:42:00) [21]

Если решаем абстрактную задачу [0] то разбить на "подстроки" не получится, т.к. в абстрактной строке может быть любое сочетание символов, т.е. надо тупо работать с исходной строкой для извлечение конкретной подстроки.
Copy(Str, i*L+1, L)
В реальности это дурь...


cross   (2010-12-28 14:34:00) [22]


> решаем абстрактную задачу по быстрой разбивке произвольной
> строки произвольной длины на куски по 2048 символов


Ega23   (2010-12-28 14:23:00) [23]


> Тогда логичный вопрос: А зачем...?


Что зачем?
Если мы решаем абстрактную задачу по быстрой разбивке произвольной строки произвольной длины на куски по 2048 символов - это одно. Собственно, изначальный вопрос был сформулирован именно так.
Если это какой-то magic-механизм чтения квази-ini-файла (т.е. ректальная тонзиллэктомия), то это совсем другое.
Автор пока шифруется.


Dennis I. Komarov   (2010-12-28 14:19:00) [24]


> Чего стоит хранение всей вашей разбивки, если в этих 2048
> чарах может встретиться комбинация #13#10?

Тогда логичный вопрос: А зачем...?


Palladin   (2010-12-28 14:16:00) [25]


> без 15 2   (28.12.10 14:05) [13]

по рукам получишь


без 15 2   (2010-12-28 14:05:00) [26]

SetLength(s2, LenS);
 CopyMemory( addr(s2[1]), addr(s[1+NumIter*LenS]), LenS);


Ega23   (2010-12-28 14:03:00) [27]

Блин.
Ну выполните уже простой код:

procedure TForm3.Button1Click(Sender: TObject);
var
 sl: TStringList;
begin
 sl := TStringList.Create;
 try
   sl.Add('мама' + #13#10 + 'мыла' + #13#10 + 'раму');
   ShowMessage(sl.Text);
 finally
   sl.Free;
 end;
end;


Чего стоит хранение всей вашей разбивки, если в этих 2048 чарах может встретиться комбинация #13#10?


Dennis I. Komarov   (2010-12-28 14:02:00) [28]


> А с чего ты взял, что в изначальной строке не может содержаться
> этих символов?  :)

Ну откуда я знаю чего там изначально. Ну есть - ладно, придумаем свой разделитеть :) #1#2#3#2#1 пойдет?


Полвторого   (2010-12-28 13:50:00) [29]

var A: integer;
...

A := (Length(S) shr 11) - 1; // обязательно знаковый тип!
for i = 0 to A do SL.Add(Copy(S, 1+(i shl 11), 2048));
SL.Add(Copy(S, 1+((A+1) shl 11), Length(S) and (2048-1)));


Ega23   (2010-12-28 13:45:00) [30]


> мне собственно все это нужно, чтобы записывать и считывать
> длинные строки из ini-файла, в ReadString ограничение 2048,
>  + возможно придется записывать строки длинной > 65535.

Ini-файлы для этого не предназначены, тебе уже вроде советовали либо формат сменить, либо из Кладовки взять.


cross   (2010-12-28 13:43:00) [31]

мне собственно все это нужно, чтобы записывать и считывать длинные строки из ini-файла, в ReadString ограничение 2048, + возможно придется записывать строки длинной > 65535.


Ega23   (2010-12-28 13:34:00) [32]


> А если так?


1. А почему строка не может быть меньше 2048?
2. Вот ANSI-строка (в кавычках)
"мама
мыла
раму"
какова её длина? :)


cross   (2010-12-28 13:09:00) [33]

А если так?


for i := 0 to Length(S) div 2048 do
   SL.Add(Copy(S, I * 2048 + 1, 2048));


Ega23   (2010-12-28 12:35:00) [34]


> пока не конец строки вставляем в (вычисляем куда) позицию
> строки #13#10

А с чего ты взял, что в изначальнойстроке не может содержаться этих символов?  :)


Dennis I. Komarov   (2010-12-28 12:33:00) [35]

пока не конец строки вставляем в (вычисляем куда) позицию строки #13#10


Плохиш   (2010-12-28 12:27:00) [36]

Кроме цикла for в делфи есть ещë минимум два типа циклов. И позиции для деленя строки искать не требуется, т.к. они заданы в условии.


Ega23   (2010-12-28 12:27:00) [37]


> cross   (28.12.10 12:21)  


Да, кстати: в твоём коде ошибка.


Ega23   (2010-12-28 12:23:00) [38]

Copy, SetLength, Length + F1


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо