![]() |
Ich versteh den Blockreadbefehl nicht :(
Kann mir den jemand erklären (die Delphi hilfe dazu ist d.o.o.f und im internet findet sich auch nix wirklich gutes dazu :( ), wie das mit Blockread und Blockwrite funktioniert?
Also bei mir sieht es jetzt folgendermaßen aus:
Delphi-Quellcode:
also ich hoffe ihr könnt mir helfen! :spin:
procedure TForm1.Button1Click(Sender: TObject);
var f: file; arr: array[0..100] of integer; i: Integer; begin AssignFile(f,'mmm.txt'); //öffnen der datei wenn ich das richtig verstehe! Reset(f,1); //das macht die datei wahrscheinlich zum lesen fertig, oder? BlockRead(f,arr[0],99); // was bedeutet der 2. parameter? - da ist ein array und der schreibt die datei in den 0ten speicherplatz //aber irgentwie macht der pc doch in dem array weiter? //und der 3. parameter zeigt bis wohin er lesen soll, wenn ich die delphihilfe richtig deute? //die ganze datei soll gelesen werden - wie bekomme ich die länge raus? geht das mit length(f) ? CloseFile(f); //das ist klar for i := 0 to {ja woher weis ich jetzt wie lang meine Datei ist? } do memo1.Lines.Add(inttostr(arr[i])); //so und irgentwie will ich ja auch noch sehen was er für zahlen liest! end; |
Re: Ich versteh den Blockreadbefehl nicht :(
Zitat:
2. Parameter eine Buffer in diesem Fall Dein Array 3. Count, die Anzahl der Zeichen die mit einem Blockread Befehl eingelesen werden.
Delphi-Quellcode:
So würde Dein Array 0..100 gefüllt werden.
BlockRead(f,arr,101);
Willst Du die ganze Datei lesen, mußt Du Blockread öfter in einer Schleife ausführen. Noch eine Frage zum Abschluß, warum willst Du die Datei so einlesen? Willst Du den Befehl Blockread kennenlernen, oder hat es einen tieferen Sinn? Vielleicht gibt es ja eine bessere Lösung für Dein Problem. Grüße Klaus |
Re: Ich versteh den Blockreadbefehl nicht :(
in einem Array liegen die einzelnen Elemente im Speicher direkt hintereinander3
also wenn man bei ersten element anfängt was zu lesen/schreiben und weitermacht, dann erwischt man auch die nachfolgenden Elemente. arr: array[0..100] of integer; ist ein statisches Array, also würde hier BlockRead(f,arr,100); und BlockRead(f,arr[0],100); auf's Selbe hinausgehn Allerdings ist bei einem dynamischem array (z.B. arr: array of integer; ) an der Speicherstelle von arr / @arr nur der Zeiger auf den Speicherplatz des Arrays, somit würde. arr[0] / @arr[0] zeigen hier aber beim dynamischen array nicht auf den Zeiger zum Array, sondern direkt auf das erste Element und demnach hier auch mit auf die nachfolgenden 99 Elemente. :angel: |
Re: Ich versteh den Blockreadbefehl nicht :(
ich will beides! den blockread-Befehl find ich interessant, weil ich z.B. noch nie mit buffern gearbeitet habe und ich möchte auch ein programm schreiben, was eine delphi unit erstellt, indem es eine Datei mit blockread einliest und dann in der Unit eine prozedur erstellt die das ganze eingelesene dann wieder speichert(blockwrite)! so kann man komfortabel irgentwelche dateien mit compilieren! und bei bedarf extrahieren ;-)
also danke für eure Hilfe der befehl gibt dann also z.B. bei einer Textdatei in dem Array die zahlen für die Zeichen aus, vom anfang bis zum z.B. 101. zeichen! um zur problematik mit der dateilänge zu kommen - da wäre dann wohl sowas angebracht:
Delphi-Quellcode:
in meiner datei steht folgendes:
var i: Integer;
wert: Array[0..1000] of Byte; weiter: Boolean; f: file; begin i := 0; AssignFile(f,'mmm.lol'); //öffnen der datei wenn ich das richtig verstehe! Reset(f,1); //das macht die datei wahrscheinlich zum lesen fertig, oder? weiter := true; while weiter = true do begin i := i + 1; try Blockread(f, wert,i); // da überschreibt er dann immer wieder biss es nicht mehr geht memo1.Lines.Add(inttostr(wert[i])); except weiter := false; end; end; CloseFile(f); form1.Caption := inttostr(i) end; sdm, v hkblsd n.sdn uübse l-.we w3.menp weö erö wei wq r aber im Memo geht es nur bis zeile 11 (eigentlich nur bis 10 aber der macht noch nen Absatz) es sind doch aber vielmehr zeichen! ^^Warum liest er nur 11 bytes? im Memo steht folgendes: 113 32 114 246 32 119 101 105 32 4 mal ganz abgesehen davon, das er über das dateiende hinaus liest!(diese Fehlermeldung ist mir erstmal egal) ich hab's noch mal probiert mit der Textdatei in der nur "Hallo" steht im memo sind nur 2 (nicht 4) Zeilen: 72 97 ^^das sieht ja schon nach dem Zeichen code aus! aber warum sind das nur die ersten 2 Zeichen? |
Re: Ich versteh den Blockreadbefehl nicht :(
Wenn es sich um eine reine Textdatei handelt, ist es besser, entweder die Datei in eine TStringList zu laden oder mit ReadLn zu arbeiten.
|
Re: Ich versteh den Blockreadbefehl nicht :(
Musst Du vielleicht einfach scrollen? Aktiviere die Scrollbars für Dein Memo.
(klingt vielleicht dümmlich, aber mir ist sowas auch schon passiert) |
Re: Ich versteh den Blockreadbefehl nicht :(
Hallo,
ein Datei komplett einlesen kann man so:
Delphi-Quellcode:
Grüße
while not eof(f) do
begin blockread(f,arr,1000); //hier liest Du 1000 Zeichen ein for i:=low(arr) to high(arr) do memo1.lines.add(IntToStr(arr[i])); end; Klaus |
Re: Ich versteh den Blockreadbefehl nicht :(
Zitat:
@Klaus01: so kommt gleich am anfang die Fehlermeldung mit dem Dateiende! @iGoA hab ich aktiviert - ändert nix! |
Re: Ich versteh den Blockreadbefehl nicht :(
Versuchs mal mit
Delphi-Quellcode:
Blockread(f, wert[i], 1);
|
Re: Ich versteh den Blockreadbefehl nicht :(
Zitat:
Du musst dir erstmal überlegen, in welches Format du einlesen willst. Warum nimmst du ein Array of integer? Eine untypisierte Datei wurde (früher) eben genau deswegen verwendet, weil man Werte unterschiedlichen Types abgespeichert hat. Ansonsten hat man schon immer typisierte Dateien (oder Texdateien) verwendet. btw: Buffer gibt es auch bei TFileStream und der ist allemal besser als eine untypisierte Datei. |
Re: Ich versteh den Blockreadbefehl nicht :(
Moin, Moin,
mir scheint, dass da einiges wirre durcheinandergewürfelt wird. Mit
Delphi-Quellcode:
öffnest du die Datei und bestimmst eine Blockgröße von EINEM Byte.
Reset(f,1)
Infolge deiner Inkrementierung von i liest du in den Schleifen eine variable Menge von Bytes: Im ersten Durchgang 1x1=1 Byte im zweiten Durchlauf 2x1=2 Byte, im Dritten 3x1=3 Byte ... so kommt es dann dazu, dass versucht wird, über das Dateiende hinaus zu lesen... Schau dir doch mal genauer die Befehlssyntax an :roll: |
Re: Ich versteh den Blockreadbefehl nicht :(
@em-sigma: cool damit gibt er bei der Hallo datei dashier aus:
3 0 0 0 37 0 0 0 2 0 0 0 14 0 0 0 0 0 0 1 84 246 70 1 60 44 56 126 das sieht schon besser aus ;) @taaktaak Wie soll ich das anders machen ? vieleicht so?:
Delphi-Quellcode:
dann kommt dasselbe wie vorher(mit "i")
Blockread(f, wert, 1);
so und jetzt hab ich's ohne while gemacht <- das scheint das beste zu sein (auch wenn noch nen paar bytes mit 0 sind das muss wohl so sein!) ^^und es kommt keine Fehlermeldun ;) suuper! Also nochmal zum mitschreiben:
Delphi-Quellcode:
var i: Integer;
wert: Array[1..1000] of Byte; f: file; begin AssignFile(f,'mmm.lol'); //öffnen der datei wenn ich das richtig verstehe! Reset(f,1); //das macht die datei wahrscheinlich zum lesen fertig, oder? while weiter = true do Blockread(f, wert, 1); CloseFile(f); for i:=low(wert) to high(wert) do memo1.lines.add(IntToStr(wert[i])); form1.Caption := inttostr(i);//so lang ist di datei! end; |
Re: Ich versteh den Blockreadbefehl nicht :(
Blockread hat ja noch einen 4ten Parameter, der gibt die Zahl der tatsächlich gelesenen Bytes an. Üblicherweise bricht man die Schleife dann ab, wenn der IstWert (4ter Parameter) vom SollWert (3ter Parameter) abweicht - das bedeutet dann nämlich, dass er mehr lesen sollte als noch gelesen werden konnten.
Den Befehl eof() habe ich noch nie im Zusammenhang mit BlockRead gesehen?! Ich habe noch nicht so recht begriffen, was du letztlich mit deinem Code erreichen willst. Vermutlich gibt es aber, wie schon von anderen erwähnt wurde, bessere Möglichkeiten die Daten einzulesen. |
Re: Ich versteh den Blockreadbefehl nicht :(
ich find es trotzdem spannend mal die einzelnen Bytes einer Textdatei zu erforschen ;)
|
Re: Ich versteh den Blockreadbefehl nicht :(
Ok, nichts gegen einzuwenden
- aber da bietet sich vielleicht eher ein HEX-Editor an :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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