Zahlen aus Textdatei einlesen



  • Hallo!

    Ich habe ein paar Probleme die Zahlen aus einer Textdatei auszulesen bzw. diese dann weiter zu verwenden.
    Die Datei heißt beziehungen.txt, das Öffnen und auslesen klappt auch. Jedoch ist das Ziel bestimmte Zahlen zu suchen und dann die Zeile, in der die Zahl steht auszugeben.

    Die Textdatei hat folgendes Format (ein kleiner Ausschnitt):
    1 707 1
    2 65 1
    2 170 2
    2 230 1
    2 297 6
    2 349 2

    Das ist der Code, den ich bisher dazu habe:

    #include <iostream> 
    using namespace std; 
    #include <fstream> 
    #include <stdlib.h> 
    #include <string.h> 
    
    struct beziehungen { 
        struct beziehungen *naechster; 
        int pate; 
        int vater; 
        int kind; 
        }; 
    
    enum zustand {inPate, inVater}; 
    
    struct beziehungen *ladenamen(ifstream &eingabe); 
    struct beziehungen *ladeidentifikation(ifstream &eingabe); 
    struct beziehungen *sucheid(struct beziehungen *wurzel, char *bezeichung); 
    
    int main() { 
        char kommando [64]; 
    
        struct beziehungen *wurzel = NULL, *jetzt; 
    
        ifstream eingabe; 
    
        eingabe.open("beziehungen.txt"); 
    
        if (!eingabe) { 
    
            cout << "Datei existiert nicht!" << endl; 
            return 0; 
        } 
    
        wurzel = ladenamen(eingabe); 
    
        for (;;) { 
            cout << "An welcher Person sind Sie interessiert? Bitte Ordnungsnummer eingeben:" << endl; 
            cout << "(Mit '*' beenden Sie das Programm.)" << endl; 
            cin.getline(kommando, 64, '\n'); 
            jetzt = sucheid (wurzel, kommando); 
                if (jetzt != NULL) 
                { 
                    cout << "Diese ID hat den Namen: " << jetzt->vater << " mit der Nummer: " << jetzt->kind << endl; 
                } 
                else if (*kommando=='*') { 
                    return 0; 
                } 
    
                else { 
                    cout << "Diese ID existiert nicht." << endl; 
    
                } 
    
            } 
    
    } 
    
    struct beziehungen *ladenamen(ifstream &eingabe) 
    { 
        struct beziehungen *wurzel = NULL, *jetzt=NULL, *neu; 
    
        while (!eingabe.eof()) 
        { 
            neu = ladeidentifikation(eingabe); 
            if (neu != NULL) 
            { 
                if (wurzel == NULL) wurzel = neu; 
                else jetzt->naechster = neu; 
                jetzt = neu; 
    
            } 
        } 
    
            return wurzel; 
    } 
    
        struct beziehungen *ladeidentifikation(ifstream &eingabe) 
        { 
    
            struct beziehungen *beziehung; 
            char zeichen; 
            char puffer[100]; 
            int zaehler; 
            enum zustand zustand; 
    
            beziehung = new struct beziehungen; 
            beziehung->naechster = NULL; 
    
            zaehler = 0; 
    
            for (;;) 
                { 
                eingabe.get(zeichen); 
                if (eingabe.eof()) return NULL; 
                switch(zeichen) 
                   { 
                case ' ': 
                      puffer[zaehler]='\0'; 
                      zaehler=0; 
                      beziehung->pate=atoi(puffer); 
                      if (beziehung->pate==0) 
                      { 
                          zustand=inPate; 
                          break; 
                      } 
                      else if (zustand!=inVater) 
                      { 
                          beziehung->pate=atoi(puffer); 
                          zustand=inVater; 
                          break; 
                      } 
    
                      else if (zustand=inVater) 
                      { 
                          beziehung->vater=atoi(puffer); 
                          break; 
                      } 
                case '\n': 
                   puffer[zaehler]='\0'; 
                   zaehler=0; 
                   beziehung->kind=atoi(puffer); 
                   break; 
                default: 
                   puffer[zaehler]=zeichen; 
                   zaehler++; 
                   break; 
                } 
    
            } 
        } 
    
        struct beziehungen *sucheid(struct beziehungen *wurzel, char *bezeichnung) 
        { 
            while (wurzel != NULL) 
            { 
                if (!strcmp(wurzel->pate, bezeichnung)) return wurzel; 
                wurzel = wurzel->naechster; 
            } 
    
            return NULL; 
        }
    

    Mein einziger Fehler ist, dass man strcmp nicht mit int benutzen kann. Ich weiß jedoch nicht, was ich sonst noch verwenden könnte.

    Wäre super, wenn mir jemand hefen könnte. 🙂



  • Das ist C mit streams.
    Du könntest dir hier so viel sparen mit den richtigen Werkzeugen.

    while(!in.eof())
    

    ist nicht so toll (bzw. unpraktisch). Entweder du verwendest std::getline
    http://www.cplusplus.com/reference/string/string/getline/
    und erhälts jede Zeile einzeln die du dann untersuchen kannst. Oder du liest direkt Zahlen

    int Zahl = 0;
    while (in >> Zahl) { /* ... */ }
    

    ^
    Das hier löst schon viele praktische Probleme.

    1. struct name* //...
      Ist sowas von C. C++ hat echte Objekte und Klassen. Das könntest du nutzen.
      new / delete / malloc / free / zeiger würden hier alle komplett dadurch überflüssig.

    Soweit erstmal.



  • Du mischst da C mit C++ und machst den Versuch einen eigenen kleinen 8schlechten) Parser zu schreiben.

    Du kannst mit einem C++ (Eingabe-)Stream einfach mehrere Daten hintereinander lesen:

    std::istream & in = std::cin; // oder halt einen std::ifstream
    
    int a, b, c;
    in >> a >> b >> c; // z.B. bei: 1 5345 38
    

    Da musst du nicht kilometerlange Switch-Case Kaskaden bauen, die dann auch noch falsche unerwünschte Zeichen durchlassen.


Log in to reply