![]() |
2 dimensionalen Array in Datei speichern und wieder laden
Hi, ich hab einen 2d-Array
Delphi-Quellcode:
den ich in einer externen Datei speichern und wieder daraus laden möchte.
f:array[1..12,1..2] of string;
Kann mir jemand sagen wie ich das am besten anstelle? |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Delphi-Quellcode:
const
IDENT_TMYARRAY = 'TMyArray'; BUF_SIZE = 4096;
Delphi-Quellcode:
type
TMyArray = array[1..12, 1..2] of String;
Delphi-Quellcode:
procedure SaveToFile(const MyArray: TMyArray; const FileName: String);
var Stream: TFileStream; Writer: TWriter; I, J: Integer; begin Stream := TFileStream.Create(FileName, fmCreate); try Writer := TWriter.Create(Stream, BUF_SIZE); try Writer.WriteSignature; Writer.WriteIdent(IDENT_TMYARRAY); for I := 1 to 12 do for J := 1 to 2 do Writer.WriteString(MyArray[I, J]); finally Writer.Free; end; finally Stream.Free; end; end;
Delphi-Quellcode:
procedure LoadFromFile(var MyArray: TMyArray; const FileName: String);
var Stream: TFileStream; Reader: TReader; I, J: Integer; begin Stream := TFileStream.Create(FileName, fmOpenRead); try Reader := TReader.Create(Stream, BUF_SIZE); try Reader.ReadSignature; if Reader.ReadIdent <> IDENT_TMYARRAY then raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.'); for I := 1 to 12 do for J := 1 to 2 do MyArray[I, J] := Reader.ReadString; finally Reader.Free; end; finally Stream.Free; end; end; |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
danke schön :)
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Der Code funktioniert einwandfrei bei dateien die ich vorher mit SaveToFile erstellt habe.
Will ich jetzt aber, ich bin ja dumm, eine beliebige Datei mit LoadFromFile öffnen, passiert folgendes:
Bitte um Hilfe! Danke |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
ReadSignatur und ReadIdent prüfen, ob der Stream mit den gespeicherten Daten übereinstimmt. Damit nicht versehentlich falsche Daten geladen werden, die nicht zu deinem Array passen.
|
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Windows API" nach "Sonstige Fragen zu Delphi" verschoben.
Hat nichts mit Windows-API zu tun |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Die Exception dürfte zwecks des try-finally-blocks aber auch nur beim starten aus delphi raus passieren.
im kompilierten programm wird wohl keine kommen air |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
@Airblader: Doch! In IDE und außerhalb!
Bei einer beliebigen Datei welche die Signatur und das Ident nicht enthält, werden die oben genannten Exceptions ausgelöst, was kann ich dagegen machen. Ich möchte vor allem Spider bitten, sich das anzuschauen! Danke! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
also das is vielleicht ein bischen einfacher:
Delphi-Quellcode:
type TMyArray = array[0..12,0..2] of integer;
procedure Save(Arr: TMyArray); var f: file of TMyArray; begin AssignFile(f, FILENAME); Rewrite(f); try Write(f,Arr); finally CloseFile(f); end; end; procedure Load(var Arr: TMyArray); var f: file of TMyArray; begin AssignFile(f, FILENAME); Reset(f); try Read(f,Arr); finally CloseFile(f); end; end; |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
@gekmihesg: Danke, aber möchte es mit Streams machen!
@Sprint: Dein Code funktioniert einwandfrei, wenn ich ihn auf Dateien die ich vorher mit SaveToFile gespeichert habe. Will ich aber irgendeine Datei, z.B. *.zip öffnen, sollte er ja FileName + ' ist keine gültige Datei vom Typ TMyArray ausgeben. Leider kommt er nicht zu der Exception-Instanzierung sondern wirft beim Einlesen schon nach dem ReadSignature eine Exception, lass ich diese Anweisung weg, wirft er auch in der nächten Zeile einen ERead-Exception. Zusammenfassend: Der Compiler kommt nicht erst dorthin, um die gewünschte Exception auszuwerfen. Was kann ich dagegen tun? |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const IDENT_TMYARRAY = 'TMyArray'; BUF_SIZE = 4096; type TMyArray = array[1..12, 1..2] of String; procedure LoadFromFile(var MyArray: TMyArray; const FileName: String); var Stream: TFileStream; Reader: TReader; I, J: Integer; begin Stream := TFileStream.Create(FileName, fmOpenRead); try Reader := TReader.Create(Stream, BUF_SIZE); try Reader.ReadSignature; if Reader.ReadIdent <> IDENT_TMYARRAY then raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.'); for I := 1 to 12 do for J := 1 to 2 do MyArray[I, J] := Reader.ReadString; finally Reader.Free; end; finally Stream.Free; end; end; var MyArray: TMyArray; begin if OpenDialog1.Execute then begin try LoadFromFile(MyArray, OpenDialog1.FileName); except on E: Exception do ShowMessage('Folgender Fehler ist aufgetreten: ' + E.Message); end; end; end; |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Habs getestet. Funktioniert leider trotzdem nicht!
Die Anweisungen in der letzten if manipuliert ja glaub ich nur die Exception-Message! Ich glaub du hast mich falsch verstanden, muss mich dafür entschuldigen! Wie bereits gesagt funktioniert der Code einwandfrei, für dateien die die Signature und den Ident enthalten. Bei anderen beliebigen Dateien, wie einem jpeg z.b., wird bereits nach dem ReadSignature eine Exception "Unbekanntes Stream-Format" geworfen, was ich ja auf keinen Fall will. Ich möchte ja bis zu "meiner" Exception die ich selbst auslöse. Lass ich nun das ReadSignature weg, wirft er mir statt der einen Exception "Unbekannter Eigenschaftswert". D.h. ReadSignature und ReadIdent lösen bereits Exceptions aus. Der Compiler kommt gar nicht mehr zur gewünschten auszulösenden Exception! Bitte um Hilfe! Danke P.S. Bitte den Code einmal auf einen beliebige Datei testen! Bei mir werden dann leider die beiden ungewünschten Exceptions ausgelöst! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Welche gewünschte Exeption?
Ratte |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Delphi-Quellcode:
Aber eigentlich kann doch keine (interne, also nicht eigene) Exception in einem try-Block ausgelöst werden :gruebel: .
raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.');
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
ReadSignature löst sehrwohl eine Exception aus, sowie ReadIdent!
Der Try-Block verhilft nur zu einer geregelten Fehlerbehandlung (glaub ich) ! Erbitte weiter Hilfe! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Statt "Unbekanntes Stream-Format" gibt er mir halt "Folgender Fehler ist aufgetreten: Unbekanntes Stream-Format" aus.
Bitte probier es mit einer beliebigen Datei, du wirst sehen, er gibt dir diese Meldung aus. Diese Exception wird vom ReadSignature ausgelöst, "Unbekannter Eigenschaftwert" von ReadIdent vom Type EReadError wenn ein unbekannter ReadValue im Objekt vorhanden ist! Bitte unbedingt testen! Danke! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Wo genau liegt jetzt dein Problem? |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Mein Ziel: LoadFromFile soll für jeden Dateityp funktionieren.
Falls er nicht vom Format IDENT_TMYARRAY ist, soll die gewünschte Exception ausgelöst werden, ansonsten der Inhalt in die Variable MyArray geladen werden. Am besten ist wirklich das Ziel mitteilen! :wall: |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Und das macht der SourceCode ja auch.
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Wenn ich das ausführe stimmt das nur teilweise.
Bei Dateien die ich vorher mit der Speicherroutine abgespeichert habe, funktioniert es einwandfrei und die daten werden eingelesen. Mein Programm sollte eben so benutzerfreundlich wie möglich sein, dass heißt wenn man ein jpeg öffnen will, so einen schöne Fehlermeldung kommen. wenn ich jetzt eben ein jpeg öffnen dass, ja keine Signature und auch kein Ident enthält, wird bei diesem beiden read-Anweisungen eine Exception ausgelöst. Das will ich aber nicht! wahrscheinlich bin ich hier wohl der depp! :-D |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Nein, ich meine das Prog soll so idiotensicher sein, dass auch bei einer jpeg datei eine Fehlermeldung kommt, dass dieses Format nicht unterstützt wird.
Die Lösung mit der äußeren Exception hab ich jetzt geknissen. Halte es aber für unschön. Bitte nimms nicht böse. Vielleicht gehts, anders auch noch! Wenn es auch für beliebige Dateien ohne äußere Exception - Klausel funktionieren würde, wäre echt toll. Kannst du mir noch weiterhelfen, oder kann ich mir diese Lösung mit TReader und TWriter abschminken? :-D |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Schau dir mal das on E: Exception do zwischen except und end genauer an. |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
OK! Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz