![]() |
ASCII-Zeichen aus einer Datei auslesen
Ich habe eine Datei, die z.B. so aussieht:
Zitat:
Delphi-Quellcode:
daten[1]
daten : array of array of array of Byte
Zitat:
Zitat:
Oder gibt es eine möglichkeit ein array platzsparend abzuspeichern. Ich brauch auch maximal nur 6 Bit ( = 64 "Zahlen") pro array-Item. Aber 8 Bits passen ja gut, weil ich das einfach über ASCII-Zeichen umwandeln kann... |
Re: ASCII-Zeichen aus einer Datei auslesen
Nutze doch einfach einen TFileStream und dann geht es in etwa so:
Delphi-Quellcode:
...:cat:...
with TFileStream.Create(FileName, foOpenRead) do
try while Position < Size do begin // und einfach auslesen... end; finally Free; end; |
Re: ASCII-Zeichen aus einer Datei auslesen
Versuch mal die Datei als Binärdatei anzusehen.
|
Re: ASCII-Zeichen aus einer Datei auslesen
Zitat:
Zitat:
[edit]Ich habe folgenden Code gefunden:
Delphi-Quellcode:
Aber der funktioniert in abgewandelter Form nicht mehr.
const
LEVELS = 4; ROWS = 12; COLS = 12; type TDimArray = array [0..3] of Byte; TMatrix = packed array of array of array of Byte; procedure RedimMatrix(var m: TMatrix; dim: array of Byte); begin SetLength(m, LEVELS, ROWS, COLS); end; procedure SaveMatrix(m: TMatrix; fn: TFileName); var dwDim, dwSize: Cardinal; begin dwDim := (Length(m) shl 8 + Length(m[0])) shl 8 + Length(m[0, 0]); dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]); with TFileStream.Create(fn, fmCreate) do try Write(dwDim, SizeOf(dwDim)); Write(m[0], dwSize); // korrigiert finally Free; end; end; procedure LoadMatrix(var m: TMatrix; fn: TFileName); var dwDim, dwSize: Cardinal; dim: TDimArray absolute dwDim; begin with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do try Read(dwDim, SizeOf(dwDim)); // SetLength(m, Hi(dwDim), Lo(dwDim) shr 8, dwDim and $FF); // fehlerhaft SetLength(m, dim[2], dim[1], dim[0]); dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]); Read(m[0], dwSize); // korrigiert finally Free; end; end; { procedure TestMatrix; const FN = 'c:\daten\dp\map.f2m'; var m: TMatrix; iLevel, iRow, iCol: Integer; begin RedimMatrix(m, [LEVELS, ROWS, COLS]); for iLevel := Low(m) to High(m) do for iRow := Low(m[0]) to High(m[0]) do for iCol := Low(m[0, 0]) to High(m[0, 0]) do m[iLevel, iRow, iCol] := 48 + iLevel * 4 + iRow * iCol mod 10; SaveMatrix(m, fn); FillChar(m, SizeOf(m), 0); LoadMatrix(m, fn); end; } procedure TestMatrix; const FN = 'c:\daten\dp\map.f2m'; var m: TMatrix; iLevel, iRow, iCol: Integer; dwSize: Cardinal; okay: Boolean; begin RedimMatrix(m, [LEVELS, ROWS, COLS]); dwSize := LEVELS * ROWS * COLS; for iLevel := Low(m) to High(m) do for iRow := Low(m[0]) to High(m[0]) do for iCol := Low(m[0, 0]) to High(m[0, 0]) do m[iLevel, iRow, iCol] := 48 + iLevel * 4 + iRow * iCol mod 10; SaveMatrix(m, fn); FillChar(m[0], dwSize, 0); LoadMatrix(m, fn); okay := True; for iLevel := Low(m) to High(m) do for iRow := Low(m[0]) to High(m[0]) do for iCol := Low(m[0, 0]) to High(m[0, 0]) do if m[iLevel, iRow, iCol] <> 48 + iLevel * 4 + iRow * iCol mod 10 then okay := False; WriteLn(IfThen(okay, 'fine', 'rats')); end;
Delphi-Quellcode:
const
LEVELS = 2; ROWS = 12; COLS = 12; type TDimArray = array [0..3] of Byte; TMatrix = packed array of array of array of Byte; procedure RedimMatrix(var m: TMatrix; dim: array of Byte); begin SetLength(m, LEVELS, ROWS, COLS); end; procedure SaveMatrix(m: TMatrix; fn: TFileName); var dwDim, dwSize: Cardinal; begin dwDim := (Length(m) shl 8 + Length(m[0])) shl 8 + Length(m[0, 0]); dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]); with TFileStream.Create(fn, fmCreate) do try Write(dwDim, SizeOf(dwDim)); Write(m[0], dwSize); // korrigiert finally Free; end; end; procedure LoadMatrix(var m: TMatrix; fn: TFileName); var dwDim, dwSize: Cardinal; dim: TDimArray absolute dwDim; begin with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do try Read(dwDim, SizeOf(dwDim)); // SetLength(m, Hi(dwDim), Lo(dwDim) shr 8, dwDim and $FF); // fehlerhaft SetLength(m, dim[2], dim[1], dim[0]); dwSize := Length(m) * Length(m[0]) * Length(m[0, 0]); Read(m[0], dwSize); // korrigiert finally Free; end; end; procedure TestMatrix; const FN = 'c:\map.f2m'; var m: TMatrix; iLevel, iRow, iCol: Integer; dwSize: Cardinal; okay: Boolean; begin RedimMatrix(m, [LEVELS, ROWS, COLS]); dwSize := LEVELS * ROWS * COLS; Form1.Memo1.Text := ''; for iLevel := Low(m) to High(m) do for iRow := Low(m[0]) to High(m[0]) do begin Form1.Memo1.Text := Form1.Memo1.Text + #13#10; for iCol := Low(m[0, 0]) to High(m[0, 0]) do begin m[iLevel, iRow, iCol] := Random(256); Form1.Memo1.Text := Form1.Memo1.Text + ' ' + IntToStr(m[iLevel, iRow, iCol]); end; end; SaveMatrix(m, fn); end; procedure TForm1.Button1Click(Sender: TObject); begin TestMatrix; end; procedure TForm1.Button2Click(Sender: TObject); const FN = 'c:\map.f2m'; var m: TMatrix; iLevel, iRow, iCol: Integer; dwSize: Cardinal; okay: Boolean; begin LoadMatrix(m, fn); Form1.Memo1.Text := ''; for iLevel := Low(m) to High(m) do for iRow := Low(m[0]) to High(m[0]) do begin Form1.Memo1.Text := Form1.Memo1.Text + #13#10; for iCol := Low(m[0, 0]) to High(m[0, 0]) do begin Form1.Memo1.Text := Form1.Memo1.Text + ' ' + IntToStr(m[iLevel, iRow, iCol]); end; end; end; end. |
Re: ASCII-Zeichen aus einer Datei auslesen
Hat keiner einen Fehler gesehen??
|
Re: ASCII-Zeichen aus einer Datei auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Fabian,
der Code war von mir und nicht gut getestet. Schlimmer noch ist, dass er vom Ansatz her nicht funktioniert, da mehrdimensionale dynamische Arrays wohl nicht dicht gepackt werden. Als Wiedergutmachung hänge ich dir eine Demo an, die zumindest bei meinen ersten Tests funktioniert hat. Freundliche Grüße |
Re: ASCII-Zeichen aus einer Datei auslesen
Danke marabu! Scheint zu funktionieren!
|
Re: ASCII-Zeichen aus einer Datei auslesen
So ich habe nun ein weiteres Problem!
Und zwar habe ich in der ersten Zeile einen String. Was müsste ich dann an marabus Code modifizieren, dass es einen String in der 1. Zeile hat? |
Re: ASCII-Zeichen aus einer Datei auslesen
Hallo Fabian,
von deinem Dateimuster in Beitrag #1 musst du ja schon abrücken, wenn du meinen Code verwenden möchtest. Ich erwarte die Dimensionsangaben vor dem Binärteil, damit ich das aufnehmende Array entsprechend dimensionieren kann. Für die vorangestellte Textzeile würde ich eine Standardlänge (z.B. 64 Byte) festlegen, auf den ersten 63 Byte den mit null oder blank characters aufgefüllten String speichern und bei Offset 63 (das 64. und letzte Byte) noch ein EOF (#26) setzen. Damit kannst du den String beim Laden problemlos überlesen und wer die Datei auf der Konsole anschaut, der sieht nur die ersten 63 Byte. Grüße vom marabu |
Re: ASCII-Zeichen aus einer Datei auslesen
Und dein Code? Wie bringe ich ihn dazu nur ab den 65. Byte zu lesen?
Und übrigens: Wie kann ich da eigentlich 64 Chars "vorsetzen"? Also einfach über TStringList:
Delphi-Quellcode:
sl := TStringList.Create;
sl.add(Name); sl.SaveToFile(Path); sl.Free; bm := TByteMap.Create; bm.Load(Path); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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 by Thomas Breitkreuz