Entwickler-Ecke

Dateizugriff - Datei mit 2884802 - 1Byte Zeichen laden


CaptManu - Sa 28.03.09 14:38
Titel: Datei mit 2884802 - 1Byte Zeichen laden
Hallo, ich habe schon ewig gesucht, doch leider noch nichts gefunden.


Problem ist, ich habe die Nasa Höhendaten von hier:
ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/ bspw
ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/N55E061.hgt.zip



Das sind Dateien mit einer Zeile von 2884802 ASCI Zeichen. (1 Byte Zeichen, also auch Leerzeichen, Zeilenumbruch, Steuerzeichen,....)

Ich müsste die Zeichen irgendwie einlesen können. Es würde reichen, wenn ich bspw. wüsste: Zeichen an der Stelle 2310 = 'ö' oder 567982 = Umbruch


Ich hatte schon versucht, es mit einem TStringlist.Loadfromfile zu versuchen. Da passiert nichts und das TstringList bleit leer. Des Weiteren glaube ich nicht, dass das Tstringlist mit dem Umbruch und Sonderzeichen zu Recht kommen würde.

Ich dachte schon an die Möglichkeit mit „Array [0..2884802] of Char“ zu arbeiten. Ich weiß nur nicht, ob Char auch wirklich die 256 möglichen Werte (inklusive Zeilenumbruch) aufnehmen kann, und wie ich die Datei in ein solches Arry laden kann.


für Ideen bin ich sehr dankbar.

vg CaptManu


jaenicke - Sa 28.03.09 14:42

Nimm einen TFileStream + Position, kopiere den ggf. in einen TMemoryStream damits schneller geht.

Oder nimm AssignFile, Reset, (FileSeek, Read, ggf. Read oder beides wiederholen), CloseFile.


Timosch - Sa 28.03.09 15:52

user profile iconCaptManu hat folgendes geschrieben Zum zitierten Posting springen:

Ich weiß nur nicht, ob Char auch wirklich die 256 möglichen Werte (inklusive Zeilenumbruch) aufnehmen kann

Ob Char alle Zeichen des ASCII-Zeichensatzes enthalten kann? Ja natürlich! Genau das ist ja Char...


jaenicke - Sa 28.03.09 16:23

Trotzdem ist eine TStringList keine sinnvolle Lösung. Bei so großen Dateien würde das unnötig langsam werden. Da sind die anderen Methoden bedeutend schneller, wenn es um zeichenweisen Zugriff geht.


CaptManu - Sa 28.03.09 23:07

Ich danke schon einmal für die Antworten.

Aber irgendwie bekomme ich das mit TFileStream noch nicht ganz hin, dass nur bestimmte Zeichen eingelesen werden. Kannst du das bitte für so einen Anfänger wie mich ein bissel genauer beschreiben?

Danke dir schonmal ganz herzlich!
vg


jaenicke - Sa 28.03.09 23:28


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  i: Integer;
  CurChar: Char;
  MyFile: TFileStream;
begin
  MyFile := TFileStream.Create(Pfad + Dateiname, fmOpenRead);
  try
    for i := 1 to MyFile.Size do
    begin
      MyFile.Read(CurChar, SizeOf(CurChar));
      ShowMessage(CurChar);
    end;
  finally
    MyFile.Free;
  end;
end;
So liest du die Buchstaben ein und zeigst sie per ShowMessage an. Stattdessen könntest du sie dann z.B. analysieren.

Und wie gesagt könnte es sinnvoll sein einen TMemoryStream zu benutzen.


CaptManu - Sa 28.03.09 23:38

Der fängt doch aber immer beim ersten Zeichen an auszugeben?


jaenicke - Sa 28.03.09 23:42

Ja, wenn du zu einem bestimmten gehen willst, dann musst du die Eigenschaft Position entsprechend setzen und dann von dort aus lesen.


tommie-lie - So 29.03.09 00:49


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  data: array of Char;
  file: TFileStream;
begin
  SetLength(data, 2884802);
  file = TFileStream.Create('N55E061.hgt', fmOpenRead);
  try
    file.Read(data[0], Length(data));
  finally
    file.Free();
  end;
  // Zugriff dann wie gewohnt über data[0..2884801]
end;
Wenn du anschließend ohnehin Ord() benutzt, weil du in wirklichkeit keine Zeichen einliest, sondern Zahlen, dann kannst du auch gleich ein array of Byte nehmen.

Alternative: Memory Mapped File.


Martok - So 29.03.09 03:37

Das Format ist hier [ftp://e0srp01u.ecs.nasa.gov/srtm/version2/Documentation/SRTM_Topo.pdf] unter 3.1 beschrieben, nix mit Zeile oder so: einfach nur Bytes hinter einander weg.

Du liest also einfach die per Stream in ein 2-Dimensionales, quadratisches Array of Word, drehst die Byte-Order um und kannst dann die Felder direkt als 'nnn Meter' interpretieren.

Ich hab selber einen SRTM-Viewer [http://www.martoks-place.de/delphi/opengl/srtm-view/] geschrieben... ggf. kann ich dir die relevanten Teile mal raussuchen.


CaptManu - Mo 30.03.09 14:29

Vielen Dank an alle!

Wie die Geschwindigkeit nun aussieht muss ich erst noch testen, aber der Zugriff ist schon einmal wunderbar.

vielen Dank