|
|
Регистрация | << Правила форума >> | 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); jmp $ ; Happy End! The Cake Is A Lie. |
#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]
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 04.05.2012 в 18:44. |
#14
|
|||
|
|||
Цитата:
Подскажите юзеру как в массив положить строки? |
#15
|
|||
|
|||
Цитата:
|