Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 657

/ вопрос открыт /

Приветствую, уважаемые эксперты!
У меня такой вопрос, когда произвожу парсинг текстового файла и замену нужных мне значений, а потом сохранение, на выходе получаю какую то галиматью, а при отладке вроде как все нормально преобразуется.

Правда сам файл не txt, но если рассуждать логически то состоит из тех же самых байтов, что и txt. Пример файла прикрепляю ниже.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Menus, XPMan, StdCtrls, Math;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Label1: TLabel;
  12. Label2: TLabel;
  13. Label3: TLabel;
  14. Edit1: TEdit;
  15. Edit2: TEdit;
  16. Edit3: TEdit;
  17. Label4: TLabel;
  18. Label5: TLabel;
  19. Button1: TButton;
  20. XPManifest1: TXPManifest;
  21. MainMenu1: TMainMenu;
  22. File1: TMenuItem;
  23. Open1: TMenuItem;
  24. OpenDialog1: TOpenDialog;
  25. Label6: TLabel;
  26. Label7: TLabel;
  27. Edit4: TEdit;
  28. procedure Open1Click(Sender: TObject);
  29. procedure Button1Click(Sender: TObject);
  30. private
  31. { Private declarations }
  32. public
  33. { Public declarations }
  34. end;
  35.  
  36. type Combine = record
  37. Str: String;
  38. LayerNum: Integer;
  39. End;
  40.  
  41.  
  42. Function ParseAndChangeTemp(ParseString,first,last: String):String;
  43. Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
  44.  
  45. Function AddString(Destination,Source:String; Position:Integer): String;
  46. Function CopyFromPosToEnd(Source: String; Position: Integer):String;
  47. Function CopyFromBegToPos(Source: String; Position: Integer):String;
  48. Procedure Make();
  49.  
  50. var
  51. Form1: TForm1;
  52. Mem1,Mem2: TMemoryStream;
  53. FilePath: string;
  54. Dest, Dest2: String;
  55.  
  56. layer,temp,NumRun,first,last,step: integer;
  57. LastString, S: String;
  58. i: integer;
  59. comb: combine;
  60. Pos,StringEnd: Cardinal;
  61. StringLength: Integer;
  62.  
  63. position, tmp: PChar;
  64. num, n: Cardinal;
  65.  
  66. Dst1,Dst2: String;
  67. Param1,Param2: PChar;
  68.  
  69. const
  70. z: string = 'G1 Z';
  71.  
  72. implementation
  73.  
  74. {$R *.dfm}
  75.  
  76. Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
  77. var
  78. ch: Char;
  79.  
  80. Begin
  81. ch:='0';
  82. while ((ch<>chr(13)) and (Pos<=Mem.Size-1)) do
  83. Begin
  84. Mem.Read(ch,1);
  85. Pos:=Pos+1;
  86. End;
  87. Result:=Pos;
  88. End;
  89.  
  90.  
  91.  
  92. Function ParseAndChangeTemp(ParseString,first,last: String):String;
  93. var
  94. pos, tmp,tmp2: PChar;
  95. num, n: integer;
  96. Rez: String;
  97.  
  98. Begin
  99. tmp:=PChar(ParseString);
  100. tmp2:=PChar(First);
  101. Rez:=ParseString;
  102. While StrPos(tmp,tmp2)<>nil do
  103. Begin
  104. Dest:='';
  105. Dest2:=last;
  106.  
  107. pos:=StrPos(tmp,PChar(First));
  108.  
  109. num:=Cardinal(pos)-Cardinal(tmp)-1;
  110. Dest:=CopyFromBegToPos(ParseString,num);
  111.  
  112. num:=num+Length(First)+1;
  113. Dest2:=CopyFromPosToEnd(ParseString,num);
  114.  
  115. num:=Length(Dest);
  116. Dest:=AddString(Dest,last,num);
  117.  
  118. num:=Length(Dest);
  119. Rez:=AddString(Dest,Dest2,num);
  120. tmp:=PChar(Rez);
  121. End;
  122.  
  123. Result:=Rez;
  124. End;
  125.  
  126.  
  127.  
  128. procedure TForm1.Open1Click(Sender: TObject);
  129. begin
  130. if OpenDialog1.Execute=True then
  131. FilePath:=OpenDialog1.FileName;
  132. end;
  133.  
  134.  
  135.  
  136. procedure TForm1.Button1Click(Sender: TObject);
  137. begin
  138. Make;
  139. end;
  140.  
  141.  
  142.  
  143.  
  144. Function AddString(Destination,Source:String; Position:Integer): String;
  145. Var
  146. DstLngth,SrcLngth: Integer;
  147. n: Integer;
  148. Ch: Char;
  149.  
  150. Begin
  151. DstLngth:=Length(Destination);
  152. SrcLngth:=Length(Source);
  153.  
  154. If ((Position<>0) and (Position<=DstLngth)) then
  155. Begin
  156. DstLngth:=Position+SrcLngth;
  157. SetLength(Destination,DstLngth);
  158. For n:=0 to (DstLngth-1) do
  159. Begin
  160. Ch:=Source[n+1];
  161. Destination[n+Position+1]:=Ch;
  162. End;
  163. End
  164. else
  165.  
  166.  
  167. Result:=Destination;
  168. End;
  169.  
  170.  
  171.  
  172.  
  173. Function CopyFromPosToEnd(Source: String; Position: Integer):String;
  174. Var
  175. TmpStr: String;
  176. StrLngth: Integer;
  177. Ch:char;
  178.  
  179. Begin
  180. StrLngth:= Length(Source);
  181. SetLength(TmpStr,(StrLngth-Position));
  182. If ((Position<=(StrLngth-1)) and (Position>0)) then
  183. Begin
  184. For n:=Position+1 to StrLngth do
  185. Begin
  186. ch:=Source[n];
  187. TmpStr[n-Position]:=Ch;
  188. End;
  189. End
  190. else
  191.  
  192.  
  193. Result:=TmpStr;
  194. End;
  195.  
  196.  
  197.  
  198.  
  199. Function CopyFromBegToPos(Source: String; Position: Integer):String;
  200. Var
  201. TmpStr: String;
  202. StrLngth: Integer;
  203. Ch:char;
  204.  
  205. Begin
  206. StrLngth:= Length(Source);
  207. SetLength(TmpStr,(StrLngth-(StrLngth-Position-1)));
  208. If ((Position>=0) and (Position<(StrLngth-1))) then
  209. Begin
  210. For n:=0 to (Position) do
  211. Begin
  212. ch:=Source[n+1];
  213. TmpStr[n+1]:=Ch;
  214. End;
  215. End
  216. else
  217.  
  218.  
  219. Result:=TmpStr;
  220. End;
  221.  
  222.  
  223.  
  224. Procedure Make();
  225. Begin
  226. Mem1:=TMemoryStream.Create;
  227. Mem2:=TMemoryStream.Create;
  228. Mem1.LoadFromFile(FilePath);
  229.  
  230. temp:=(StrToInt(Unit1.Form1.Edit2.Text)+1);
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. step:=Round(step/(last-first));
  238. i:=1;
  239.  
  240.  
  241.  
  242. Mem2.SetSize(0);
  243. while (Pos+1)<Mem1.Size do // <>
  244. Begin
  245.  
  246.  
  247.  
  248.  
  249. S:='';
  250.  
  251.  
  252.  
  253.  
  254. if i<=2 then
  255.  
  256. else
  257.  
  258.  
  259. if S<>LastString then
  260. i:=i+1;
  261.  
  262. Mem2.WriteBuffer(S,Length(S));
  263.  
  264. End;
  265.  
  266. Mem2.SaveToFile(FilePath);
  267.  
  268. Mem1.Free;
  269. Mem2.Free;
  270. End;
  271.  
  272. end.


SOA Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 28 апреля 2017, 17:22
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 35; последнее сообщение — 1 мая 2017, 11:23; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2]

min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:45 [#21]:

Если не перестанешь вот так писать программы:
var
  Form1: TForm1;
  Mem1,Mem2: TMemoryStream;
  FilePath: string;
  Dest, Dest2: String;
 
  layer,temp,NumRun,first,last,step: integer;
  LastString, S: String;
  i: integer;
  comb: combine;
  Pos,StringEnd: Cardinal;
  StringLength: Integer;
 
  position, tmp: PChar;
  num, n: Cardinal;
 
  Dst1,Dst2: String;
  Param1,Param2: PChar;
 
const
  z: string = 'G1 Z';
 
implementation
я тебя вычислю по IP, найду и оторву руки. :-D
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:46 [#22]:

Так в том то и дело, что никаких наворотов я сделать то не пытаюсь, а всего лишь загружаю txt файл в потоке памяти, после чего определяю, где конец строки в этом файле считываю строку, изменяю ее, после чего тупо записываю в другой поток памяти и так далее, пока не закончится первый поток, а после этого сохраняю второй поток в виде файла с тем же именем и расширением. И что самое главное при отладке все OK, а вот когда открываешь получившийся файл ХЕРНЯ какая то.
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:52 [#23]:

А че такого то, да много переменных, потому что прога уже дня три переписывается, и сначала писалась под строки типа PChar, в результате чего сначала появлялась ошибка так как проге не нравилось, что переменные объявлялись как локальные, после чего все переменные были объявленны как глобальные, и ошибка вроде как исчезла, но появилась другая о которой я писал в самом начале, когда программа парсила первые 3 строки. а на 4 при вызове функции обработки PChar с трок спотыкалась об ошибку обращения к недоступному участку памяти, причем функция вызывалась не моя, а стандартная дельфийская, после чего про PChar я успешно забыл и сейчас у меня проблем собращением не к тому участку памяти не возникает, ну а переменные да остались. т.к. программа еще пишется.

Пы СЫ все ненужное и лишнее я по возможности конечно удалил, но не в самом проекте, а в коде который идет вместе с вопросом.
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:55 [#24]:

Я не об этом, а о том, что ты себе придумал проблему на ровном месте, упёрся в неё, как баран, и просишь помощи. Я пытаюсь помочь, но ты мне доказываешь, что твой способ лучше.

Я программированием с 1990 года занимаюсь. Как думаешь, мне можно доверять? Парсеры текста - это одна из моих специализаций. Я такие разборы писал - с твоей хернёй рядом не стояло.

Повторяю последний, блять, раз - выкинь в жопу всё написанное и сделай, как я говорю. Удивишься, как всё будет быстро и красиво.

Юзать мемористрим для работы с текстом - это как ойфоном орехи колоть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 19:00 [#25]:

Цитата (SOA):

да много переменных

Дело не в количестве, а в том, что они, блять, глобальные. Наш препод в универе, помню, говорил: "увижу глобальную переменную там, где её использование не необходимо - подсрачник и пересдача автоматически". И правильно, кстати.

Выбрось всё и начни с нуля. Сэкономишь время и нервы. Хорош костыль насиловать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 19:01 [#26]:

Буду думать...
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 19:07 [#27]:

Флаг тебе в руки. :-D
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 29 апреля 2017, 11:46 [#28]:

Все вопрос решен, оказалось что при сохранении данных в поток нужно было не тупо строку сохранять а почему то разименованный указатель на строку PChar. Благо всетаки в хелп залез, там разделе "Using streams to read or write data" пишут следующее:

procedure caststring;
var
  fs: TFileStream;
const
  s: string = 'Hello';
begin
  fs := TFileStream.Create('temp.txt', fmCreate or fmOpenWrite);
  fs.Write(s, Length(s));  // this will give you garbage
  fs.Write(PChar(s)^, Length(s));  // this is the correct way
end;

Уфь )))
min@y™

min@y™ (статус: Доктор наук), 29 апреля 2017, 12:47 [#29]:

покажи исходник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 29 апреля 2017, 13:36 [#30]:

Исходник изначально был выложен в тексте вопроса, но основное отличие в строчке
Mem2.WriteBuffer(S,Length(S));
которую как оказалось нужно было изменить на
Mem2.WriteBuffer(PChar(S)^,Length(S));
после чего в выходном файле уже не нули, а нормальные строки как и должно быть.

Сам проект
https://yadi.sk/d/--6U62BY3HULvr
min@y™

min@y™ (статус: Доктор наук), 29 апреля 2017, 13:58 [#31]:

if S <> ''
  then Mem2.WriteBuffer(S[1], Length(S));
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 29 апреля 2017, 14:32 [#32]:

Ну да так тоже работает.
min@y™

min@y™ (статус: Доктор наук), 29 апреля 2017, 14:41 [#33]:

один хер, глупо юзать низкоуровневое программирование и прямой доступ к памяти на такой задаче. Вместо того, чтобы использовать готовые отлаженные решения.

Ты угробил вагон времени на программу, которая пишется за полчаса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 29 апреля 2017, 14:44 [#34]:

Я так и не понял, что программа делает с файлом на основе введённых данных.

Да и хуй с ней.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 1 мая 2017, 11:23 [#35]:

Цитата (min@y™):

Цитата (min@y™):

Я так и не понял, что программа делает с файлом на основе введённых данных.

А это секретно :-) Меняет показания - то, что намерено на то, что нужно - для военпреда :-P

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 ноября 2017, 08:31
Выполнено за 0.08 сек.
Рейтинг@Mail.ru