![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Помогите написать конвертер. Приведенный ниже код работает только если строка не больше 200 символов.
Нужно из файла все что располагается между / / записать в массив. Код:
if form1.OpenDialog1.Execute then fname:=form1.OpenDialog1.FileName;
TStr := TStringList.Create;
try
TStr.LoadFromFile(fname);
for t:=0 to TStr.Count-1 do
begin
str:=TStr.Strings[t];
k:=1;
a:='';
for i:=1 to length(str) do
begin
if str[i]<>'/' then a:=a+str[i] else
begin
m[k]:=a;
Inc(k);
a:='';
end;
end;
m[k]:=a;Последний раз редактировалось Aristarh Dark, 04.05.2012 в 15:32. |
|
#2
|
||||
|
||||
|
Запихиваем весь файл в одну строку, затем как-то так:
Код:
uses StrUtils;
...
CopyStart:=Pos('/',str);
CopyEnd:=PosEx('/', str, CopyStart+1);
S := Copy(str, CopyStart+1, CopyEnd-CopyStart-1); |
|
#3
|
|||
|
|||
|
Спасибо Ваш код намного меньше.
Но у меня проблема в том что когда использую переменную String обрезается часть текста TStr.LoadFromFile(fname); //- строка 1000 символов for t:=0 to TStr.Count-1 do begin str:=TStr.Strings[t]; //- строка 250 символов в итоге часть текста пропадает Последний раз редактировалось tabivan, 04.05.2012 в 17:01. |
|
#4
|
||||
|
||||
|
Если TStr - это TStringList то он разбивает текст на строки по #13 и еще если встречается символ #0 - то он интерпретируется как конец строки.
|
|
#5
|
|||
|
|||
|
Цитата:
|
|
#6
|
|||
|
|||
(((1111111;;1111;22/02пппппп/03ппппппп/04аааааа/0519791215/068401052537/07аааааа;аааа;аааааа;аааааа;/08ааааа;ааааа;аааааа;ааааа;-;-;-;-/09ааааааааааа;ааааааааааа;аааааааа;аааааааааааа;-;-;-;-2225/2383160/2420080520/27118470/3049/314/332/4322802/4463/4514/ааааааааааааааааааааааааааааааааааааааааааааааа/6120080518/аааааааааааааааааааааааааааааааааааааааааа;-;-;-;-781/79аааааааааааааааааааааааааааааааааааааааа,22041/99вввв=34157702))) |
|
#7
|
||||
|
||||
|
Цитата:
![]() Код:
var s:string; begin s:='asdasdasdasd'#0'asdkahsdlkhasdааа'; ShowMessage(s); end; |
|
#8
|
|||
|
|||
|
Цитата:
аты попробуй этот Код:
program Project1;
{$APPTYPE CONSOLE}
var
s:string;
begin
s:='asdasdasdasd'#0'asdkahsdlkhasdaaa';
writeln(s);
Readln;
end.чтоб ты сильно не мучался в разгадках в ShowMessage строка приводится к Pchar Последний раз редактировалось robt, 04.05.2012 в 17:44. |
|
#9
|
||||
|
||||
|
Если я правильно понял вам неужно вот что:
Код:
Var
SL: TStringList;
begin
SL := TStringList.Create;
SL.Delimiter := '/';
SL.LoadFromFile('c:\Test.txt');
SL.DelimitedText := SL.Text;
Memo1.Text := SL.Text;
SL.Free;
end; |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
tabivan (04.05.2012)
| ||
|
#10
|
|||
|
|||
|
Цитата:
Да. Только я не понял как это сделано?И как мне теперь эти строки сложить в массив m[i]? |
|
#11
|
||||
|
||||
|
[offtop]
Цитата:
Последний раз редактировалось Bargest, 04.05.2012 в 18:12. |
|
#12
|
|||
|
|||
|
Цитата:
0 на конце строки нету вообще, ибо ее длинна известна и он не нужен все преабразования типа Pchar(s) или String(p) или s:=p это НЕ приведение типов, а "магия компилятора" в виде вызовов функций LStrToPChar и LStrFromPChar |
|
#13
|
||||
|
||||
|
Дизассемблируй свой пример и посмотри на строку до копирования в s. На её конце стоит ноль. Поэтому преобразование вида
Код:
PAnsiChar(Pointer(S)); Код:
var p:pointer; ... P:=Pointer(S); ShowMessage(PAnsiChar(P)); Код:
asm mov eax, s mov p, eax end; ShowMessage(PAnsiChar(P)); Код:
Getmem(p, Length(s)+1); CopyMemory(p, Pointer(s), Length(s)+1); ShowMessage(PAnsiChar(p)); А вот приведение PChar->String, конечно, проводить нужно. При этом строка, разумеется, копируется до первого нуля, и высчитывается её размер. ЗЫЖ кстати, если посмотреть код функции преобразования String в PChar, то можно увидеть, что так оно и есть: Код:
function _LStrToPChar(const S: AnsiString): PAnsiChar; begin If Pointer(s) = nil then Result := @EmptyStringA.Nul else Result := Pointer(s); end; Последний раз редактировалось Bargest, 04.05.2012 в 18:44. |
|
#14
|
|||
|
|||
|
Цитата:
Подскажите юзеру как в массив положить строки? |
|
#15
|
|||
|
|||
|
Цитата:
|