Autor |
Beitrag |
CaptManu
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 28.03.09 14:38
Hallo, ich habe schon ewig gesucht, doch leider noch nichts gefunden.
Problem ist, ich habe die Nasa Höhendaten von hier:
e0srp01u.ecs.nasa.go...sion2/SRTM3/Eurasia/ bspw
e0srp01u.ecs.nasa.go...asia/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
Zuletzt bearbeitet von CaptManu am Sa 28.03.09 14:42, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: 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...
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 28.03.09 23:38
Der fängt doch aber immer beim ersten Zeichen an auszugeben?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 29.03.09 03:37
Das Format ist hier 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 geschrieben... ggf. kann ich dir die relevanten Teile mal raussuchen.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
CaptManu 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
|
|