Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 12:08

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Funktionen zum Textfile auslesen
BeitragVerfasst: Do Mär 16, 2006 18:18 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. int wert_von_wert
  3.  
  4. 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 17, 2006 15:22 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 17, 2006 15:41 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 17, 2006 16:11 
Offline
DGL Member
Benutzeravatar

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:
  1. var
  2.   FS: TFormatSettings;
  3. begin
  4.   GetLocaleFormatSettings (LANG_ENGLISH, FS);
  5.   StrToFloat('32.45', FS)
  6. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 17, 2006 16:36 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 18, 2006 19:29 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
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:
Code:
  1. unit StringHelpers;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes;
  7.  
  8. procedure GetWords(TheString, Separator: String; var Strings: TStringList);
  9. function WordCount(TheString, Separator: String): Integer;
  10. function GetWord(TheString, Separator: String; Nummer: Integer): String;
  11.  
  12. implementation
  13.  
  14. procedure GetWords(TheString, Separator: String; var Strings: TStringList);
  15. begin
  16.   try
  17.     Strings.Clear;
  18.     while Pos(Separator, TheString)>0 do
  19.     begin
  20.       Strings.Add(Copy(TheString, 1, Pos(Separator, TheString)-1));
  21.       TheString:=Copy(TheString, Pos(Separator, TheString)+Length(Separator),
  22.       Length(TheString));
  23.     end;
  24.     Strings.Add(TheString);
  25.   except
  26.   end;
  27. end;
  28.  
  29. function WordCount(TheString, Separator: String): Integer;
  30. var OurStrings: TStringList;
  31. begin
  32.   OurStrings:=TStringList.Create;
  33.   GetWords(TheString, Separator, OurStrings);
  34.   result:=OurStrings.count;
  35.   OurStrings.free;
  36. end;
  37.  
  38. function GetWord(TheString, Separator: String; Nummer: Integer): String;
  39. var OurStrings: TStringList;
  40. begin
  41.   OurStrings:=TStringList.Create;
  42.   GetWords(TheString, Separator, OurStrings);
  43.   try
  44.     result:=OurStrings[Nummer-1];
  45.   except
  46.     result:=''
  47.   end;
  48.   OurStrings.free;
  49. end;
  50.  
  51. end.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 18, 2006 21:58 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]