Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ließt BlockRead aus Datei nich richtig ein? (https://www.delphipraxis.net/14631-liesst-blockread-aus-datei-nich-richtig-ein.html)

PAX 12. Jan 2004 20:37


Ließt BlockRead aus Datei nich richtig ein?
 
Hallo!

Ich glaube mein Computer ist verhext :twisted: ! Ich hab eine Zeichenkette in eine Datei undefinierten Typs geschrieben, und wenn ich die wieder in einen String einlese, + den Inhalt von einem Label mit ihm angleichen möchte, bricht das Programm genau in diesem Moment mit einer Zugriffsverletzung ab. Ich weiß nich mehr weiter. Hier der betreffende Quellcode:

Delphi-Quellcode:
Var f:file; t,s:string; result:integer;
begin
 assignfile(f,'c:\f.txt');
 rewrite(f); s:='blob';
 blockwrite(f,s,1);
 closefile(f);
 reset(f);
 blockread(f,t,1,result);
 closefile(f);
 label1.caption:=t;
end.
Ich bin gespannt, worans liegt. :kotz:

PAX

WtF 13. Jan 2004 10:54

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Hallo Pax,
also hier deine Lösung:

Delphi-Quellcode:
Var f:file; s:string; result:integer;
begin
assignfile(f,'c:\f.txt');
rewrite(f); s:='blob';
blockwrite(f,s,1);
closefile(f);
reset(f);
blockread(f,s,1,result);
closefile(f);
label1.caption:=s;
end.
Mfg

[edit=Luckie]Code-Tags durch Delphi-Tags ersetzt. Mfg, Luckie[/edit]

Luckie 13. Jan 2004 13:04

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Ich würde mal die Variable result umbenennen. Result ist eine interne Variable für den Rückgabewert einer Funktion.

Desweiteren, kuck dir deinen Code mal an. Was machts du denn:
  • Öffnen
  • Zurücksetzten
  • Schreiben
  • Schließen
  • Zurücksetzten
  • Lesen
  • Schließen
Fällt dir was auf? Du öffnest sie nicht wieder vor dem Lesen.

@WtF: Warum postest du seinen nicht funktionierenden Code noch mal? :roll:

teebee 13. Jan 2004 13:23

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Zitat:

Zitat von Luckie
...
  • Zurücksetzten
Fällt dir was auf? Du öffnest sie nicht wieder vor dem Lesen.

Doch er öffnet, das Reset öffnet die Datei zum Lesen.

So funktioniert es: Blockread/-write arbeiten mit Speicherbereichen, aus denen bzw. in die geschrieben wird. D.h. man sollte vorher die Buffer-Bereiche reservieren.

Delphi-Quellcode:
Var f:file;
    res:integer;
    s,t: Array[0..127] of Char;
begin
 assignfile(f,'c:\f.txt');
 rewrite(f);
 s:='blob';
 blockwrite(f,s,1);
 closefile(f);
 reset(f);
 blockread(f,t,1,res);
 closefile(f);
 label1.caption:=t;
end;
Gruß, teebee

Luckie 13. Jan 2004 13:33

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Aber das CloseFile hebt die Verknüpfung von der Datei zur Dateivariabeln doch wieder auf oder irre ich da? Dazu die Delhi-Hilfe:
Zitat:

Zitat von Delphi-Hilfe
Terminates the association between file variable and an external disk file.

Ergo muss nach CloseFile erst wieder eine Zuweisung mit AssigneFile erfolgen, um wieder auf die Datei zugreifen zu können.

choose 13. Jan 2004 13:46

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Hallo Luckie,

dieser Pascal-Datentyp ist in Wirklichkeit in Record in dem uA ein Datei-Handle abgelegt wird, dass mit Close geschlossen wird.

Überzeuge Dich selbst:
Delphi-Quellcode:
type
  PTextRec = ^TTextRec;

begin
  AssignFile(myFile, AFileName);
  Writeln(PTextRec(@myFile)^.Name);

  Reset(myFile);
  try
    Writeln(PTextRec(@myFile)^.Name);
  finally
    Close(myFile);
    Writeln(PTextRec(@myFile)^.Name);
  end;
end;

Luckie 13. Jan 2004 13:52

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Zitat:

Zitat von choose
dieser Pascal-Datentyp ist in Wirklichkeit in Record in dem uA ein Datei-Handle abgelegt wird, dass mit Close geschlossen wird.

Widerlegst du mich jetzt oder bestätigst du mich mit der Aussage? Wenn ich ein Datei-Handle schließe und somit wieder freigebe, dürfte CreateFile ins Leere laufen oder nicht?

WtF 13. Jan 2004 13:53

Re: Ließt BlockRead aus Datei nich richtig ein?
 
@Luckie : weil der nicht funktionierende code so funktioniert :wink:
Zuerst dachte ich auch das es an der variable result liegt - ist aber nicht so - ich habs extra ausprobiert.

Code:
procedure TForm1.Button1Click(Sender: TObject);
Var f:file; s:string; r:integer;
begin
assignfile(f,'c:\f.txt');
rewrite(f); s:='blob';
blockwrite(f,s,1);
reset(f);
blockread(f,s,1,r);
closefile(f);
Label1.Caption:=s;
end;
Das eine close kann man nat. weglassen...

choose 13. Jan 2004 14:00

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Zitat:

Zitat von Luckie
Widerlegst du mich jetzt oder bestätigst du mich mit der Aussage?

ein kurzes Ausprobieren sollte Dir zeigen, dass die Folge
Delphi-Quellcode:
AssignFile(myFile, AFileName);
Reset(myFile);
Close(myFile);
Reset(myFile);
Readln(myFile, myByte);
funktioniert.

Zitat:

Zitat von Luckie
Wenn ich ein Datei-Handle schließe und somit wieder freigebe, dürfte CreateFile ins Leere laufen oder nicht?

CreateFile erwartet kein Handle sondern ua einen Dateinamen, der ja, wie zuvor gezeigt von Close unbeeinflusst bleibt. Der Tatsächliche Code steht in der Unit System bei OpenFile
Code:
LEA     EAX,[EBX].TFileRec.Name
PUSH    EAX
CALL    CreateFileA
CMP     EAX,-1
JZ      @@error
MOV     [EBX].TFileRec.Handle,EAX
wie man sieht, wird das Handle nach dem erfolgreichen Aufruf in die Struktur innerhalb des File-Datentyps zurückgeschrieben.

teebee 13. Jan 2004 14:01

Re: Ließt BlockRead aus Datei nich richtig ein?
 
Zitat:

Zitat von Luckie
Aber das CloseFile hebt die Verknüpfung von der Datei zur Dateivariabeln doch wieder auf oder irre ich da? Dazu die Delhi-Hilfe:
Zitat:

Zitat von Delphi-Hilfe
Terminates the association between file variable and an external disk file.

Ergo muss nach CloseFile erst wieder eine Zuweisung mit AssigneFile erfolgen, um wieder auf die Datei zugreifen zu können.

Also ich interpretiere das so, dass die Verbindung mit dem File selbst beendet wird, nicht die Verbindung mit dem Filenamen. D.h. die Filevariable bezieht sich bei einem neuen Öffnen immernoch auf den gleichen Filenamen, ein erneutes AssignFile kann man sich also sparen.

@PAX: Ich glaube, es wäre einfacher, ein File of Char zuverwenden, dann kannst Du bequem read/write/ln benutzen.

Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz