AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ASCII-Zeichen aus einer Datei auslesen

Ein Thema von xZise · begonnen am 8. Jan 2007 · letzter Beitrag vom 17. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

ASCII-Zeichen aus einer Datei auslesen

  Alt 8. Jan 2007, 14:26
Ich habe eine Datei, die z.B. so aussieht:
Zitat:
Ein kleiner Text
#0#0#0#0
#0#2#1#0
#0#3#0#0
#6#6#6#6
#6#0#0#6
#6#0#0#6
#6#6#6#6
Und nun möchte ich dass er das in ein 3D - Array schreibt:
daten : array of array of array of Byte daten[1]
Zitat:
0000
0210
0300
daten[2]
Zitat:
6666
6006
6006
Aber es gibt ein Problem beim 1. ASCII-Zeichen: Es ist ein EOF-Marker, wie kann ich nun darüberhinaus auslesen?
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...
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 8. Jan 2007, 14:29
Nutze doch einfach einen TFileStream und dann geht es in etwa so:
Delphi-Quellcode:
with TFileStream.Create(FileName, foOpenRead) do
try
  while Position < Size do
  begin
    // und einfach auslesen...
  end;
finally
  Free;
end;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 8. Jan 2007, 14:29
Versuch mal die Datei als Binärdatei anzusehen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 8. Jan 2007, 14: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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 10. Jan 2007, 07:40
Hat keiner einen Fehler gesehen??
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 10. Jan 2007, 10:31
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
Angehängte Dateien
Dateityp: zip mapdemo_881.zip (2,8 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 12. Jan 2007, 13:57
Danke marabu! Scheint zu funktionieren!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 13. Jan 2007, 18:51
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?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 14. Jan 2007, 12:58
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

Re: ASCII-Zeichen aus einer Datei auslesen

  Alt 15. Jan 2007, 18:03
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);
...
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz