txt Datei auslesen und formatieren



  • Hallo,

    Bei mir ist C nun schon ein ganzes Weilchen her und ich stehe hier vor einem Problem:

    Während dem Programmablauf werden Koordinaten in einer txt-Datei gespeichert. Diese möchte ich auslesen, formatieren und in meinem struct speichern.

    Die Textdatei sieht folgendermaßen aus:

    <Längengrad> <Breitengrad> <Kurs>

    Also z.B.:

    N45.000 E8.000 145

    Nun muss ich nicht nur Längengrad/Breitengrad/Kurs trennen, sondern auch für spätere Berechnungen die Zahlen(double) von den Chars(N/S bzw E/W).

    Leider habe ich keinen Schimmer wie ich das in C am geschicktesten anstellen könnte.

    Mein struct das mit Daten gefüttert werden möchte:

    typedef struct stPos
    {
    double longitude;
    double latitude;
    double heading;
    char longichar;
    char latichar;
    }ST_POS_T;

    LG



  • Ich habe mir nun überlegt die Textdatei in drei Teile (je nach den Leerzeichen) zu trennen und dann mit atof() zunächst die double Werte einzulesen. Wie kann ich aber meine drei Werte nach den Leerzeichen aufteilen ?


  • Mod

    bammbamm schrieb:

    Ich habe mir nun überlegt die Textdatei in drei Teile (je nach den Leerzeichen) zu trennen und dann mit atof() zunächst die double Werte einzulesen. Wie kann ich aber meine drei Werte nach den Leerzeichen aufteilen ?

    Besserer Vorschlag: (f)scanf



  • Lass mich raten, du willst das Programm noch pünktlich zum Ende der Kieler Woche fertigstellen?
    Das lässt sich sehr einfach mittels eines Quasi-Einzeilers und fscanf erledigen, also

    typedef struct stPos
    {
    double longitude;
    double latitude;
    double heading;
    char longichar;
    char latichar;
    }ST_POS_T;
    
    int main()
    {
      static ST_POS_T d[10000];
      int i=0;
      FILE *f=fopen("datei.txt","r");
    
      if(!f)
        return perror("datei.txt"),1;
    
      while( i<10000 && 5==fscanf(" %c%lf %c%lf%lf",&d[i].longichar,&d[i].longitude,&d[i].latichar,&d[i].latitude,&d[i].heading) )
        ++i;
    
      fclose(f);
      printf("%d Datensätze eingelesen\n",i);
      return 0;
    }
    

    Den Rest wirst du ja wohl alleine können, die Grundlagen sind gelegt.



  • Wie kann ich mit fscanf() denn nach Leerzeichen trennen ? Mein bisheriger Code sieht wie folgt aus:

    FILE *koords_txt;
    	char text[100];
    	koords_txt = fopen("koords.txt","r");
    	fscanf(koords_txt,"%c",text);
    

    Das müsste ja dann aber den kompletten Text aus der Datei auslesen?!



  • bammbamm schrieb:

    Wie kann ich mit fscanf() denn nach Leerzeichen trennen ? Mein bisheriger Code sieht wie folgt aus:

    Steht ja schon bei Wutz.

    scanf trennt bei den meisten Formatspecifiern bei Leerzeichen (Whitespace) und überliest diese auch.
    Ein Leerzeichen im Formatstring bedeutet auch: Whitespace überlesen.



  • Was ich bei dem Code von Wutz noch nicht ganz verstehe ist die Schleife bis i<10000. Ist das die Zeichenanzahl die ich einlese ? Also in diesem Fall 10000 Zeichen ?

    Desweiteren 5 == fscanf(..). Ich dachte fscanf() gibt nur 0 bzw 1 zurück ? Wird der Rückgabewert für jede Variable die ich einlesen möchte um 1 erhöht ?

    LG


  • Mod

    bammbamm schrieb:

    Was ich bei dem Code von Wutz noch nicht ganz verstehe ist die Schleife bis i<10000. Ist das die Zeichenanzahl die ich einlese ? Also in diesem Fall 10000 Zeichen ?

    Nein. Guck doch mal genau hin, wo die 10000 überall auftaucht und was mit ihr gemacht wird. Die 10000 hat überhaupt gar nichts mit dem scanf-Aufruf zu tun. Die sind nicht magisch verknüpft, weil sie in der gleichen Zeile stehen. Nicht raten, sondern die Grundgrammatik der Sprache verstehen. while-Schleifen, Vergleiche, Verknüpfungen, das muss alles sitzen, wenn du ein funktionierendes Programm schreiben möchtest. Du musst von jedem Zeichen in einem Programm genau wissen, was es tut und warum es da ist. Was <, && und ähnliches tun, das kannst du in einem gutem Grundlagenbuch nachlesen. Sogar in schlechten.

    Desweiteren 5 == fscanf(..). Ich dachte fscanf() gibt nur 0 bzw 1 zurück ? Wird der Rückgabewert für jede Variable die ich einlesen möchte um 1 erhöht ?

    Wenn du solche Fragen hast, dann guckt man in eine Referenz:
    http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/



  • Die while-schleife befüllt max. 10000 Einträge des struct-Arrays sequentiell mit fehlerfrei aus der Datei gelesenen Datensätzen, die Typumwandlung (double,char) hat fscanf auch schon erledigt.
    Jetzt stelle dich mal nicht so an, wieviele Monate wolltest du denn in dein Programm ohne Hilfe investieren, wenn du schon am Lesen eines ganz kleinen Programms mit einer while-Schleife scheiterst?



  • bammbamm schrieb:

    Was ich bei dem Code von Wutz noch nicht ganz verstehe ist die Schleife bis i<10000. Ist das die Zeichenanzahl die ich einlese ? Also in diesem Fall 10000 Zeichen ?

    das ist lediglich eine schutzmaßnahme, damit nicht über die grenzen des
    struktur-arrays geschrieben wird.

    bammbamm schrieb:

    Desweiteren 5 == fscanf(..). Ich dachte fscanf() gibt nur 0 bzw 1 zurück ? Wird der Rückgabewert für jede Variable die ich einlesen möchte um 1 erhöht ?

    fscanf gibt die anzahl der eingelesenen elemente zurück, in diesem fall sind es 5.

    die while-schleife wird also nur dann ausgeführt, wenn i < 10000 ist und wenn
    ein datensatz bestehend aus 5 elementen erfolgreich eingelesen wird.


Anmelden zum Antworten