|
Вопрос # 6 657/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
У меня такой вопрос, когда произвожу парсинг текстового файла и замену нужных мне значений, а потом сохранение, на выходе получаю какую то галиматью, а при отладке вроде как все нормально преобразуется.
Правда сам файл не txt, но если рассуждать логически то состоит из тех же самых байтов, что и txt. Пример файла прикрепляю ниже.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Menus, XPMan, StdCtrls, Math;
-
- type
- TForm1 = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Edit1: TEdit;
- Edit2: TEdit;
- Edit3: TEdit;
- Label4: TLabel;
- Label5: TLabel;
- Button1: TButton;
- XPManifest1: TXPManifest;
- MainMenu1: TMainMenu;
- File1: TMenuItem;
- Open1: TMenuItem;
- OpenDialog1: TOpenDialog;
- Label6: TLabel;
- Label7: TLabel;
- Edit4: TEdit;
- procedure Open1Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- type Combine = record
- Str: String;
- LayerNum: Integer;
- End;
-
-
- Function ParseAndChangeTemp(ParseString,first,last: String):String;
- Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
-
- Function AddString(Destination,Source:String; Position:Integer): String;
- Function CopyFromPosToEnd(Source: String; Position: Integer):String;
- Function CopyFromBegToPos(Source: String; Position: Integer):String;
- Procedure Make();
-
- 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
-
- {$R *.dfm}
-
- Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
- var
- ch: Char;
-
- Begin
- ch:='0';
- while ((ch<>chr(13)) and (Pos<=Mem.Size-1)) do
- Begin
- Mem.Read(ch,1);
- Pos:=Pos+1;
- End;
- Result:=Pos;
- End;
-
-
-
- Function ParseAndChangeTemp(ParseString,first,last: String):String;
- var
- pos, tmp,tmp2: PChar;
- num, n: integer;
- Rez: String;
-
- Begin
- tmp:=PChar(ParseString);
- tmp2:=PChar(First);
- Rez:=ParseString;
- While StrPos(tmp,tmp2)<>nil do
- Begin
- Dest:='';
- Dest2:=last;
-
- pos:=StrPos(tmp,PChar(First));
-
- num:=Cardinal(pos)-Cardinal(tmp)-1;
- Dest:=CopyFromBegToPos(ParseString,num);
-
- num:=num+Length(First)+1;
- Dest2:=CopyFromPosToEnd(ParseString,num);
-
- num:=Length(Dest);
- Dest:=AddString(Dest,last,num);
-
- num:=Length(Dest);
- Rez:=AddString(Dest,Dest2,num);
- tmp:=PChar(Rez);
- End;
-
- Result:=Rez;
- End;
-
-
-
- procedure TForm1.Open1Click(Sender: TObject);
- begin
- if OpenDialog1.Execute=True then
- FilePath:=OpenDialog1.FileName;
- end;
-
-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Make;
- end;
-
-
-
-
- Function AddString(Destination,Source:String; Position:Integer): String;
- Var
- DstLngth,SrcLngth: Integer;
- n: Integer;
- Ch: Char;
-
- Begin
- DstLngth:=Length(Destination);
- SrcLngth:=Length(Source);
-
- If ((Position<>0) and (Position<=DstLngth)) then
- Begin
- DstLngth:=Position+SrcLngth;
- SetLength(Destination,DstLngth);
- For n:=0 to (DstLngth-1) do
- Begin
- Ch:=Source[n+1];
- Destination[n+Position+1]:=Ch;
- End;
- End
- else
-
-
- Result:=Destination;
- End;
-
-
-
-
- Function CopyFromPosToEnd(Source: String; Position: Integer):String;
- Var
- TmpStr: String;
- StrLngth: Integer;
- Ch:char;
-
- Begin
- StrLngth:= Length(Source);
- SetLength(TmpStr,(StrLngth-Position));
- If ((Position<=(StrLngth-1)) and (Position>0)) then
- Begin
- For n:=Position+1 to StrLngth do
- Begin
- ch:=Source[n];
- TmpStr[n-Position]:=Ch;
- End;
- End
- else
-
-
- Result:=TmpStr;
- End;
-
-
-
-
- Function CopyFromBegToPos(Source: String; Position: Integer):String;
- Var
- TmpStr: String;
- StrLngth: Integer;
- Ch:char;
-
- Begin
- StrLngth:= Length(Source);
- SetLength(TmpStr,(StrLngth-(StrLngth-Position-1)));
- If ((Position>=0) and (Position<(StrLngth-1))) then
- Begin
- For n:=0 to (Position) do
- Begin
- ch:=Source[n+1];
- TmpStr[n+1]:=Ch;
- End;
- End
- else
-
-
- Result:=TmpStr;
- End;
-
-
-
- Procedure Make();
- Begin
- Mem1:=TMemoryStream.Create;
- Mem2:=TMemoryStream.Create;
- Mem1.LoadFromFile(FilePath);
-
- temp:=(StrToInt(Unit1.Form1.Edit2.Text)+1);
-
-
-
-
-
-
- step:=Round(step/(last-first));
- i:=1;
-
-
-
- Mem2.SetSize(0);
- while (Pos+1)<Mem1.Size do // <>
- Begin
-
-
-
-
- S:='';
-
-
-
-
- if i<=2 then
-
- else
-
-
- if S<>LastString then
- i:=i+1;
-
- Mem2.WriteBuffer(S,Length(S));
-
- End;
-
- Mem2.SaveToFile(FilePath);
-
- Mem1.Free;
- Mem2.Free;
- End;
-
- end.
 |
Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 28 апреля 2017, 17:22
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 35; последнее сообщение — 1 мая 2017, 11:23; участников в обсуждении: 3.
Страницы: [« Предыдущая] [1] [2]
|
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, найду и оторву руки.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 28 апреля 2017, 18:46 [#22]:
Так в том то и дело, что никаких наворотов я сделать то не пытаюсь, а всего лишь загружаю txt файл в потоке памяти, после чего определяю, где конец строки в этом файле считываю строку, изменяю ее, после чего тупо записываю в другой поток памяти и так далее, пока не закончится первый поток, а после этого сохраняю второй поток в виде файла с тем же именем и расширением. И что самое главное при отладке все OK, а вот когда открываешь получившийся файл ХЕРНЯ какая то.
|
|
SOA (статус: Посетитель), 28 апреля 2017, 18:52 [#23]:
А че такого то, да много переменных, потому что прога уже дня три переписывается, и сначала писалась под строки типа PChar, в результате чего сначала появлялась ошибка так как проге не нравилось, что переменные объявлялись как локальные, после чего все переменные были объявленны как глобальные, и ошибка вроде как исчезла, но появилась другая о которой я писал в самом начале, когда программа парсила первые 3 строки. а на 4 при вызове функции обработки PChar с трок спотыкалась об ошибку обращения к недоступному участку памяти, причем функция вызывалась не моя, а стандартная дельфийская, после чего про PChar я успешно забыл и сейчас у меня проблем собращением не к тому участку памяти не возникает, ну а переменные да остались. т.к. программа еще пишется.
Пы СЫ все ненужное и лишнее я по возможности конечно удалил, но не в самом проекте, а в коде который идет вместе с вопросом.
|
|
min@y™ (статус: Доктор наук), 28 апреля 2017, 18:55 [#24]:
Я не об этом, а о том, что ты себе придумал проблему на ровном месте, упёрся в неё, как баран, и просишь помощи. Я пытаюсь помочь, но ты мне доказываешь, что твой способ лучше.
Я программированием с 1990 года занимаюсь. Как думаешь, мне можно доверять? Парсеры текста - это одна из моих специализаций. Я такие разборы писал - с твоей хернёй рядом не стояло.
Повторяю последний, блять, раз - выкинь в жопу всё написанное и сделай, как я говорю. Удивишься, как всё будет быстро и красиво.
Юзать мемористрим для работы с текстом - это как ойфоном орехи колоть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 28 апреля 2017, 19:00 [#25]:
Цитата (SOA):
да много переменных
Дело не в количестве, а в том, что они, блять, глобальные. Наш препод в универе, помню, говорил: "увижу глобальную переменную там, где её использование не необходимо - подсрачник и пересдача автоматически". И правильно, кстати.
Выбрось всё и начни с нуля. Сэкономишь время и нервы. Хорош костыль насиловать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 28 апреля 2017, 19:01 [#26]:
Буду думать...
|
|
min@y™ (статус: Доктор наук), 28 апреля 2017, 19:07 [#27]:
Флаг тебе в руки.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 29 апреля 2017, 12:47 [#29]:
покажи исходник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 29 апреля 2017, 13:36 [#30]:
Исходник изначально был выложен в тексте вопроса, но основное отличие в строчке
Mem2.WriteBuffer(S,Length(S));
которую как оказалось нужно было изменить на
Mem2.WriteBuffer(PChar(S)^,Length(S));
после чего в выходном файле уже не нули, а нормальные строки как и должно быть.
Сам проект
https://yadi.sk/d/--6U62BY3HULvr
|
|
min@y™ (статус: Доктор наук), 29 апреля 2017, 13:58 [#31]:
if S <> ''
then Mem2.WriteBuffer(S[1], Length(S));
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 29 апреля 2017, 14:32 [#32]:
Ну да так тоже работает.
|
|
min@y™ (статус: Доктор наук), 29 апреля 2017, 14:41 [#33]:
один хер, глупо юзать низкоуровневое программирование и прямой доступ к памяти на такой задаче. Вместо того, чтобы использовать готовые отлаженные решения.
Ты угробил вагон времени на программу, которая пишется за полчаса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 29 апреля 2017, 14:44 [#34]:
Я так и не понял, что программа делает с файлом на основе введённых данных.
Да и хуй с ней.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Толяныч (статус: 4-ый класс), 1 мая 2017, 11:23 [#35]:
Цитата (min@y™):
Цитата (min@y™):
Я так и не понял, что программа делает с файлом на основе введённых данных.
А это секретно Меняет показания - то, что намерено на то, что нужно - для военпреда
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|