![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
разделить строку
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