Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#24

AW: Einlesen einer FORTRAN Binärdatei mit Delphi

  Alt 19. Jul 2014, 14:10
Dann schreibt diese kleine Delphi Programm das gleiche weg... (Oder liest es ein).
Auch ohne eine Monster-Class dafür zu Programmieren.
2014 noch Leuten dazu zu raten, die alten Pascal-Files zu verwenden
Man muss doch mit Streams auch nicht gleich eine riesige, overengineerte Monster-Class programmieren. (Generics sind allerdings ganz nett in dem Fall, meine ich. Kann sein, dass die Syntax falsch ist, ich bin dank der Preise der neuen Delphi-Versionen leider nie in den Genuss gekommen.)

Delphi-Quellcode:
type
  TFortranStream = class
  protected
    FStream: TStream;
  public
    constructor Create(Stream: TStream);
    procedure Read<T>(var Rec: T);
    procedure Write<T>(const Rec: T);
  end;

implementation

{$R *.dfm}

constructor TFortranStream.Create(Stream: TStream);
begin
  FStream := Stream;
end;

procedure TFortranStream.Read<T>(var Rec: T);
var
  Len: Byte;
begin
  FStream.Read(@Len, sizeof(Byte));
  FStream.Read(@Rec, sizeof(T));
end;

procedure TFortranStream.Write<T>(const Rec: T);
var
  Len: Byte;
begin
  Len := sizeof(T);
  FStream.Write(@Len, sizeof(Len));
  FStream.Write(@Rec, sizeof(Rec));
  FStream.Write(@Len, sizeof(Len));
end;

type
  TFortranRecord = packed record
    A : Double;
    C,
    D : Integer;
    S : array[1..3] of AnsiChar;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  F : File;
  FileStream: TFileStream;
  Fortran: TFortranStream;
  Rec: TFortranRecord;
begin
  FileStream := TFileStream.Create('Test.net');
  Fortran := TFortranStream.Create(FileStream);

  Rec.A := 1.0;
  Rec.C := 2;
  Rec.D := 2;
  Rec.S[1] := 'A';
  Rec.S[2] := 'B';
  Rec.S[3] := 'C';

  Fortran.Write<TFortranRecord>(Rec);
  
  Fortran.Free;
  FileStream.Free;
end;
(Fehlerbehandlung sollte da natürlich noch rein, hat dein Beispiel aber auch nicht).
  Mit Zitat antworten Zitat