Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.05.2012, 15:30
tabivan tabivan вне форума
Прохожий
 
Регистрация: 04.05.2012
Сообщения: 5
Репутация: 10
По умолчанию Помогите написать конвертор

Помогите написать конвертер. Приведенный ниже код работает только если строка не больше 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  
Старый 04.05.2012, 16:29
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Запихиваем весь файл в одну строку, затем как-то так:
Код:
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  
Старый 04.05.2012, 16:59
tabivan tabivan вне форума
Прохожий
 
Регистрация: 04.05.2012
Сообщения: 5
Репутация: 10
По умолчанию

Спасибо Ваш код намного меньше.

Но у меня проблема в том что когда использую переменную 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  
Старый 04.05.2012, 17:01
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Если TStr - это TStringList то он разбивает текст на строки по #13 и еще если встречается символ #0 - то он интерпретируется как конец строки.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 04.05.2012, 17:25
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от Aristarh Dark
если встречается символ #0 - то он интерпретируется как конец строки.
не, для строки это не является концом,а для Pchar\Pwidechar да
Ответить с цитированием
  #6  
Старый 04.05.2012, 17:25
tabivan tabivan вне форума
Прохожий
 
Регистрация: 04.05.2012
Сообщения: 5
Репутация: 10
По умолчанию



(((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  
Старый 04.05.2012, 17:29
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от robt
не, для строки это не является концом,а для Pchar\Pwidechar да
попробуй вот такой код
Код:
var
  s:string;
begin
  s:='asdasdasdasd'#0'asdkahsdlkhasdааа';
  ShowMessage(s);
end;
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #8  
Старый 04.05.2012, 17:36
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от Aristarh Dark
попробуй вот такой код
эх школьники пошли,ничо не знают....
аты попробуй этот
Код:
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  
Старый 04.05.2012, 17:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если я правильно понял вам неужно вот что:
Код:
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  
Старый 04.05.2012, 17:54
tabivan tabivan вне форума
Прохожий
 
Регистрация: 04.05.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Если я правильно понял вам неужно вот что:

Да. Только я не понял как это сделано?
И как мне теперь эти строки сложить в массив m[i]?
Ответить с цитированием
  #11  
Старый 04.05.2012, 18:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

[offtop]
Цитата:
в ShowMessage строка приводится к Pchar
Интереснее всего способ этого приведения: хранить в указателе на "объект" строки адрес самого массива байт, а остальные поля, идущие раньше в памяти, высчитывать вычитанием из текущего адреса. Например, в Pointer(DWORD(s)-4)^ хранится четырёхбайтовая длина строки. И делфийская строка тоже на конце всегда содержит 0 для совместимости. Так что по сути никакого приведения нет, просто разные механизмы обработки одного массива.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 04.05.2012 в 18:12.
Ответить с цитированием
  #12  
Старый 04.05.2012, 18:21
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от Bargest
И делфийская строка тоже на конце всегда содержит 0 для совместимости. Так что по сути никакого приведения нет, просто разные механизмы обработки одного массива.
ты тоже не прав,бро...
0 на конце строки нету вообще, ибо ее длинна известна и он не нужен
все преабразования типа Pchar(s) или String(p) или s:=p это НЕ приведение типов, а "магия компилятора" в виде вызовов функций LStrToPChar и LStrFromPChar
Ответить с цитированием
  #13  
Старый 04.05.2012, 18:24
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Дизассемблируй свой пример и посмотри на строку до копирования в 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  
Старый 04.05.2012, 18:43
tabivan tabivan вне форума
Прохожий
 
Регистрация: 04.05.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Если я правильно понял вам неужно вот что:
Код:
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;

Подскажите юзеру как в массив положить строки?
Ответить с цитированием
  #15  
Старый 04.05.2012, 18:44
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от Bargest
Дизассемблируй свой пример и посмотри на строку до копирования в s.
это какой именно пример,и дизать ничо ненадо,есть окно CPU там все отлично видно ,что я писал выше
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter