[ reiser @ 21.08.2006. 16:24 ] @
Code:

type
  TStruktura1 : record
                 NekiString : String[20];
                 NekiBroj   : Integer;
               end;
var
  SFile : File of TStruktura1;
  str1  : TStruktura1;

begin
  AssignFile(SFile, 'C:\test.dat');
  Rewrite(SFile);
    Write(SFile, str1);
  CloseFile(SFile);
end.


^^ Ovaj kod radi ok. E sad, meni treba da mogu da zapisem dve ili vise _razlicitih_ struktura u jedan fajl i da to posle normalno iscitam. Recimo imam TStruktura1 i TStruktura2 i da mogu da zapisem obe strukture u jedan fajl. Moze li ovo ikako da se odradi ?
[ aleksandarpopov @ 21.08.2006. 17:09 ] @
Odredis koliko ti bajtova zauzima struktura pa upises u fajl, pa koliko bajtova ima druga struktura pa upises, kod iscitavanja iz fajla uzems broj bajtova za strukturu koju citas, pa toliko bajtova iscitas. Ako imas neki redosled kako ces ih upisivati onda nije problem inace ... malo je problem, mozda neki marker za strukturu koja sledi...
Nije bas "normalno" i elegantno resenje ali... kako bi drugacije?
[ reiser @ 21.08.2006. 20:29 ] @
Hvala, to je to.
[ Vdjuric @ 22.08.2006. 23:36 ] @
najbolje ti je da koristis Blockread / blockwrite za zapisivanje razlicitih struktura u fajl...Otprilike ovako:
------------
Var
FOut :File;
St1 :TStruktura1;
St2 :TStruktura2;
BlockSize, BWritten :LongInt;
Begin
AssignFile(FOut, 'C:\proba.dat');
IoResult; {$I-} Rewrite(FOut, 1); {$I+}
If (IoResult <> 0) Then; //...... ... ... ...
BlockSize:=SizeOf(TStruktura1); {$I-} BlockWrite(FOut, St1, BlockSize, BWritten); {$I+}
If (IoResult <> 0)Or(BWritten <> BlockSize) Then; //Doslo je do greske...
BlockSize:=SizeOf(TStruktura2); {$I-} BlockWrite(FOut, St2, BlockSize, BWritten); {$I+}
If (IoResult <> 0)Or(BWritten <> BlockSize) Then; //Doslo je do greske...
CloseFile(FOut);
End;
------------

Poz
[ reiser @ 23.08.2006. 00:08 ] @
Mnogo ti bre nabijen kod
Evo kako sam odradio, u sustini se svodi na isto :

Code:

procedure TMainWindow.LoadSetup(const AFileName : String);
var
  SFile    : File;
  brsetup  : TBRSetup;
  cbReaded : Integer;
begin
  AssignFile(SFile, AFileName);
  Reset(SFile, 1);
    BlockRead(SFile, percmarkers, SizeOf(TMarkers), cbReaded);
    BlockRead(SFile, brsetup, SizeOf(TBRSetup), cbReaded);
  CloseFile(SFile);
end;
[ _v!rus_ @ 28.08.2006. 23:35 ] @
Pa covek ti lepo napisa, sa sve trappovanjem i kontrolom greske, tako se pravilno i radi.

Mada, ako vec koristis Delphi a ne paskal, bolje upotrebljavaj TFileStream.
OOP, nije tipovan tj. mozes da pises i citas sta hoces, a pritom je preko base klase (TStream) kompatibilan sa celim VCL-om, 3rd party bibliotekama, itd., ukratko - standard. Za sve greske ti iskace TException koji uhvatis i obradis sa try..except, ne moras da ukljucujes/iskljucujes IO greske (ono $I+-).

Ceo File tip je obsolete vec jako dugo, ostao je tu samo zbog kompatibilnosti sa paskalom.

Code:

procedure TMainWindow.LoadSetup(const AFileName : String);
var
  SFile    : TFileStream;
  brsetup  : TBRSetup;
begin
  SFile := nil;
  try
    SFile := TFileStream.Create(AFileName, fmOpenRead);
    SFile.Read(brsetup, SizeOf(TBrSetup));
    SFile.Read(percmarkers, SizeOf(TMarkers));
    SFile.Free;
  except
    on E: Exception do
    begin
      ShowMessage(E.Message);
      if Assigned(SFile) then
        SFile.Free;
    end;
  end;
end;