Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
Delphi 2009 Professional
|
Re: ASCII-Zeichen aus einer Datei auslesen
8. Jan 2007, 15:35
Zitat von sakura:
Delphi-Quellcode:
with TFileStream.Create(FileName, foOpenRead) do
try
while Position < Size do
begin
// und einfach auslesen...
end;
finally
Free;
end;
Und "inc(Position)" ist ein Byte "weiter"?
Zitat von mkinzler:
Versuch mal die Datei als Binärdatei anzusehen.
Wie programmiert man das am besten?
[edit]Ich habe folgenden Code gefunden:
Delphi-Quellcode:
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;
Aber der funktioniert in abgewandelter Form nicht mehr.
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.
Fabian Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
|