Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Hi,
in C++ gibt es ja ein paar sehr praktische Funktionen, um Textdateien auszulesen, was nach folgendem Schema abläuft (ich habs jetzt nicht mehr genau im Kopf):
Code:
int wert_von_wert
read(Datei, "Wert: %i", wert_von_wert);
Gibt es sowas auch in Delphi? Weil bis jetzt lese ich die Dateien immer per ReadLn aus, aber da sind dann mehrere Informationen hintereinander zu finden, die zB durch ein ";" getrennt sind.
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zeilenweise eine Dateik einlesen kannst du mit TStringList.ReadFromFile (oder LoadFromFile... weiß gerade nicht)
Wenn du Wertepaare laden willst dann schau dir mal TIniFile an. IniFiles sind zwar schon recht alt, aber extrem praktisch. Ich finde zunehmend gefallen an den Dingern.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Naja, das Problem ist, dass es sich um einen komplexes "Format" handelt, in dem 3D-Daten abgelegt sind. Mit Ini ist da nix. Ich muss also das ganze parsen (weiß nicht, ob das das richtige Wort ist). Bin inzwischen soweit, dass ich mir selbst eine kleine Routine überlegt habe, um die Daten auszulesen. Nun bin ich aber auf ein ganz komisches Problem gekommen. Ich weiß jetzt nicht, ob das bei früheren Delphi-Versionen anders war, aber bei D2005 jedenfalls wird mit StrToFloat ein String mit '34.2' nicht mehr nach Float konvertiert, einer mit '34,2' aber schon. Irgendwie hatte ich noch nie so ein Problem, kann es sein, dass da was geändert wurde? Wie könnte man das umgehen. Ansonsten würde ich es so machen, dass ich erst alle Punkte durch Kommas ersetze...
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zum Einlesen würde ich dir unter Umständen ein TFileStream emfehlen. Das ist eine Kappselung von den LowLevel Dateizugriffen. Wenn du es wirklich zeilenweise brauchst und die Dateien nicht zu extrem groß werden dann spricht aber auch nichts gegen eine StringList. Sonst würde ich empfehlen mit einem TFileStream zeilenweise zu lesen. Also so lange zu lesen bis ein Zeilenumbruch kommt und dann das Ergebniss zurückliefern. Evtl kannst du da auch noch nen Buffer reinbauen der 10KB einließt und du in dem Zeilen sucht. So geht der Dateizugriff in jedem Fall schneller als zeichenweise.
Die Konvertierung: Das liegt an der jweiligen Einstellung in deinem Betriebssystem. Darin ist festgelegt, dass du Kommazeichen ein Komma hast.
Code:
var
FS: TFormatSettings;
begin
GetLocaleFormatSettings(LANG_ENGLISH, FS);
StrToFloat('32.45', FS)
end;
Damit wird als Format immer das übergegebene benutzt. In diesem Falle Englisch. Das solltest du sowohl beim laden als auch beim Speichern tun. Bei Datumsangaben etc funktioniert es genau so.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du kannst den "DecimalSeperator" (so nennt sich das ding) auch auf deiner Maschiene kirzzeitig umsetzen auf . oder , je nach bedarf. Bei DSDT.info findet du sicherlich noch mehr dazu. Einfach mal im FOrum nach DezimalSeperator suchen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
also... das Problem mit dem Punkt und Komma geht man tatsächlich am besten mit dem DecimalSeparator an. setz den einfach in deinem Prog auf '.' oder je nachdem, was du willst Das wirkt sich dann auf alle StrToFloat-Routinen aus.
das mit dem "Parsen" von Textdateien geht auch anders. Es gibt da grundsätzlich 2 Möglichkeiten. Die eine wäre, es so zu parsen wie eine Skriptsprache. Siehe dazu die entsprechenden Tutorials hier. Die andere, schnellere, Möglichkeit wäre, mit pos sich die entsprechenden Stellen zu holen. Fertige Funktionen gibt es dafür bereits:
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
OK vielen Dank Frase! So ähnlich hab ichs inzwischen auch schon gelöst, aber dein Source hat das Ganze recht schön erweitert. Bin inzwischen schon recht weit, evtl stell ich das Projekt ja bald vor
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.