Avatar billede zerohero Nybegynder
04. januar 2002 - 12:02 Der er 13 kommentarer og
1 løsning

TFileStream

Jeg har ikke megen erfaring i at bruge TFileStream. Jeg har skrevet følgende kode:


type
  TChunk3DS = record
  Tag: Word;
  Size: Cardinal;
  Position: Cardinal;
  end;

function LoadFile(FileName : string) : string;
var
  MyFile : TfileStream;
  Chunk : TChumk;
begin
  MyFile := TFileStream.Create(FileName, $0000 or $0020);
  with MyFile do
  begin
    //Reading File Chunk
    Position := 0;
    ReadBuffer(Chunk.tag, sizeof(Chunk.tag));
    ReadBuffer(Chunk.size, sizeof(Chunk.size));
    if Chunk.tag = $4D4D then
    //gør et eller andet
  end;
  MyFile.Free;
end;

Det virker fint til den filformat jeg ønsker indllæst.
Jeg har et hav af adresser til at hente andre informationer fra filen. Til det kan jeg eventuelt bruge en repeat lykke men hvorfor ikke bruge seek() - men jeg ved bare ikke hvordan...

Jeg har eksempelvis en adresse, $3D3E, den skulle give mig et fil-version værdi. Men hvordan får jeg værdien (integer) frem med seek()...

Jeg har været i Delphis hjælpe-fil men uden held...

ZeroHero

Håber I forstår hvad jeg mener.
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:04 #1
ups...
var
Chunk : TChumk => Chunk : TChunk3DS
Avatar billede martinlind Nybegynder
04. januar 2002 - 12:09 #2
Du kan enten sætte position eller bruge seek() til at søge ud lige før det du vil læse også bruge Read();

Read(MyInt,sizeof(Integer));

resultatet står så i MyInt som er af typen Integer

/Martin
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:12 #3
Hvordan søger jeg med seek() - jeg ved nemlig ikke hvilken position de forskelleige adresse har.
Og hvordan får jeg MyInt noget læseligt?
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:13 #4
Hvis du gider at lave et eksempel? :-))
Avatar billede martinlind Nybegynder
04. januar 2002 - 12:14 #5
Du SKAL kende en position, ellers går den ikke. Myint kommer til at indeholde den integer der står i filen på det sted hvor du læser.
Avatar billede martinlind Nybegynder
04. januar 2002 - 12:18 #6
Måske jeg får tid senere *S*
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:18 #7
hmmm... hvad er fordelen lige med seek() hvis man ikke kan søge med den? Det vil sige jeg bliver nødt til at benytte en repeat lykke til min søgning?
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:19 #8
takker :-))
Avatar billede martinlind Nybegynder
04. januar 2002 - 12:21 #9
Yes, det man kan gøre er at lave en header i sin fil, hvor man skriver de pos. man har brug for

/Martin
Avatar billede zerohero Nybegynder
04. januar 2002 - 12:23 #10
Hvad nu hvis det ver en streng jeg ville have i stedet for et tal-værdi?
Avatar billede gusse Nybegynder
04. januar 2002 - 12:57 #11
Procedure AddToStream ( Source , Dest : TStream );
var
  Size : Integer ;
begin
  try
    Source.position := 0 ;
    //Keep the size by puting it in the first byte
    Size := Source.Size ;
    Dest.Write(Size,SizeOf(Integer));
    Dest.CopyFrom(Source,0);
  except
  end;
end;

Procedure GetFromStream ( Source , Dest : TStream ; Index : Integer  );
Var
  Size , I : Integer ;
begin
  Dest.Position:=0;
  Source.Position := 0 ;
  For i := 0 to index-1 do begin
    Source.Read(Size,SizeOf(Integer));
    Source.Position := Source.Position + Size ;
  end;
  // if where all the way up the file pointer then someting went wrong :(
  if Source.position = Source.Size then Raise EAccessViolation.Create(\'Unknown File\') ;
  // Get the desired file size

  Source.Read(Size,SizeOf(Integer));
  // Clear Dest Buffer
  Dest.Position := 0 ;
  Dest.Size := 0 ;

  if (Size>0) and (Size<=Source.size) then
    Dest.CopyFrom(Source,Size);
  Dest.Position := 0 ;
end;
Avatar billede gusse Nybegynder
04. januar 2002 - 12:59 #12
hmmm jeg læste lidt forkert..

troede du ville gemme og indlæse en stykke af en fil..

Avatar billede martinlind Nybegynder
04. januar 2002 - 22:03 #13
Lav en form med en knap på og lave følgende kode :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// helper functions
function GetStr(AStream: TStream): String;
VAR
  Len : Integer;
begin
  AStream.Read(Len,SizeOf(Len));
  Result := \'\';
  if Len > 0 then
  begin
      SetLength(Result,Len);
      AStream.Read(Result[1],Len);
  end;
end;

procedure PutStr(AStr: String; AStream: TStream);
VAR
  Len : Integer;
begin
  Len := Length(AStr);
  AStream.Write(Len,SizeOf(Len));
  if Len > 0 then AStream.Write(Astr[1],Len);
end;

function GetInt( aStream : TStream ) : Integer;
begin
  AStream.Read(Result,SizeOf(Result));
end;

procedure PutInt( aInt : Integer; AStream : TStream );
begin
  AStream.Write(aInt,SizeOf(aInt));
end;

function GetFloat( aStream : TStream ) : Double;
begin
  AStream.Read(Result,SizeOf(Result));
end;

procedure PutFloat( aFloat : Double; AStream : TStream );
begin
  AStream.Write(aFloat,SizeOf(aFloat));
end;

function GetStream( aStream : TStream ) : TStream;
VAR
  Len : Integer;
begin
  Result := TMemoryStream.Create;
  AStream.Read(Len,SizeOf(Len));
  if Len > 0 then Result.CopyFrom(aStream,Len);
  Result.Position := 0;
end;

procedure PutStream( aValue,aStream : TStream );
VAR
  Len : Integer;
begin
  Len := aValue.Size;
  AStream.Write(Len,SizeOf(Len));
  aValue.Position := 0;
  AStream.CopyFrom(aValue,Len);
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR
  F : TFileStream;
  I : Integer;
  S : String;
begin
  F := TFileStream.Create(\'MyTest.dat\',fmCreate);
  I := 15;
  S := \'Hest\';
  PutInt(I,F);
  PutStr(S,F);
  F.Free;
  F := TFileStream.Create(\'MyTest.dat\',fmOpenRead);
  ShowMessageFmt(\'%d %s\',[GetInt(F),GetStr(F)]);
  F.Free;
end;

end.

/Martin
Avatar billede zerohero Nybegynder
22. februar 2002 - 17:19 #14
har dog ikke helt fundet ud af det endnu, men det er vist tid til at lukke dette spørgsmål...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester