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
CaptManu hat folgendes geschrieben : |
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; 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.
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!