|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TFileStream запись в конец файла
Доброго времени суток, эксперты!Возникла совершенно дурацкая проблема, на первый взгляд.Сериализую объекты в файл.Делается это в разные промежутки времени.И вместо того, чтобы каждый раз писать в конец файла, не удаляя содержимое, программа пишет поверх содержимого.Никак не могу понять, в чем ошибка.Заранее спасибо за помощь.
Код:
type TObraz = class X: array [1..49] of Integer; //вектор входного образа еще надо добавить сюда вектор "желаемый выход" T: array [1..4] of Integer; //Желаемый выход sq:string; ////////////////////////////////////////////////////////////// constructor Create(STrGrd: TStringGrid; Col, Row, I, II, III, IIII: Integer; st:string); //тут будет сериализация\десериализация и побитный парсинг Грида. procedure WriteToFile(); //также можно добавить строковое поле "имя образа" end; implementation { TObraz } //I, II, III, IIII - желаемые выходы, передаваемые с формы constructor TObraz.Create(STrGrd: TStringGrid; Col, Row, I, II, III, IIII: Integer; st:string); var u,j,k,flag:Integer; begin k:=1; for u := 0 to Row-1 do begin for j := 0 to Col-1 do begin //Читаем значение флага, которое записано под видом указателя на объект. Flag := Integer(STrGrd.Rows[u].Objects[j]); if Flag = 0 then X[k]:=0 else if flag=1 then X[k]:=1; Inc(k); end; end; //заполняем массив желаемых выходов для данного образа T[1]:=I; T[2]:=II; T[3]:=III; T[4]:=IIII; sq:=st;////////////////////////////////////////////////// end; procedure TObraz.WriteToFile; var F: TFileStream; i:Integer; begin F:=TFileStream.Create('Obr.txt', fmCreate or fmOpenReadWrite); F.Seek(0, soFromEnd); for i := 1 to High(X) do F.WriteBuffer(X[i], SizeOf(X[i])); for i := 1 to High(T) do F.WriteBuffer(T[i], SizeOf(T[i])); F.WriteBuffer(Pointer(sq)^, Length(sq)); ///////////////////////////////////////// FreeAndNil(F); end; |
#2
|
||||
|
||||
На первый взгляд, да и на второй тоже - флаг при создании файлового потока подсовывается не тот (в смысле лишь fmCreate), получается что он всё время пересоздаётся, точно не знаю как подсовывать два флажка вместе, не копался, но если делать вот так
Код:
... if FileExists('Obr.txt') then F:=TFileStream.Create('Obr.txt', fmOpenReadWrite) else F:=TFileStream.Create('Obr.txt', fmCreate); ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Сделай так:
Код:
procedure TObraz.WriteToFile(const AFileStream: TStream); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
|||
|
|||
Сделал так.
Код:
procedure TObraz.WriteToFile(const AFileStream: TStream); var //F: TFileStream; i:Integer; begin AFileStream.Seek(0, soFromEnd); for i := 1 to High(X) do AFileStream.WriteBuffer(X[i], SizeOf(X[i])); for i := 1 to High(T) do AFileStream.WriteBuffer(T[i], SizeOf(T[i])); AFileStream.WriteBuffer(Pointer(sq)^, Length(sq)); ///////////////////////////////////////// end; procedure TForm4.Button1Click(Sender: TObject); var Obr:TObraz; F: TFileStream; begin F:=TFileStream.Create('Obr.txt', fmCreate or fmOpenReadWrite); //F.Seek(0, soFromEnd); Obr:=TObraz.Create(StringGrid1,StringGrid1.ColCount,StringGrid1.RowCount,StrToInt(Edit1.Text),StrToInt(Edit2.Text),StrToInt(Edit3.Text),StrToInt(Edit4.Text),Edit5.Text); Obr.WriteToFile(F); Obr.Free; Obr:=nil; FreeAndNil(F); end; Все равно никакого эффекта( |
#5
|
||||
|
||||
Стрим должен быть ЕДИНЫМ для ВСЕХ объектов, пишущих себя в стрим.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
|||
|
|||
То есть хотите сказать, что надо создание потока вынести вообще куда-нибудь в глобальное событие, например в обработчик создания формы? И уже потом его подсовывать ко всем созданным объектам?
|
#7
|
||||
|
||||
Так точно!
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#8
|
|||
|
|||
Все работает. Спасибо за подсказку. Спасибо всем, кто откликнулся.
|