aus Textfile zahlen einlesen



  • Hallo Forum

    ich habe ein (wahrscheinlich triviales) Problem. Ich habe ein .txt file und möchte daraus double Werte einlesen, z.B.:

    23.45, 32454.23, 1.0
    23.55, 32457.98, 2.0
    ......

    Ich habe im Hinterkopf dass es eine Möglichkeit gibt das ganze über den << operator einzulesen, also

    double punkt[3];
    for(i = 0; i < 3; i++)
    {
        input >> punkt[i];
    }
    

    Allerdings scheint es den >> operator nicht für double zu geben. Habe ich jetzt einen Denkfehler drin oder muss ich mir den >> selbst definieren?
    Und wie mache ich es sonst? Das muss doch so einfach gehen wie bei C früher mit sscanf, oder nicht?



  • Ich glaube nicht, dass das Komma passend als double interpretiert werden kann. Weiter liest du nämlich nicht.



  • Geht es dir jetzt darum das du nicht weißt wie du aus einer Datei lesen kannst? Wenn ja dann schau dir mal "ifstream" an.
    http://c-plusplus.net/forum/viewtopic-var-t-is-39469.html



  • Hallo

    danke für den Tipp mit dem Komma. Ich wollte nur wissen wie ich das Problem elegant lösen kann, da ich mir fast sicher war, dass es mit dem >> operator gehen muss. Das komma kann natürlich der Fehler sein, danke.



  • Hallo nochmal

    o.k., an dem Komma lag es nicht. Er mag generell beim kompilieren den Ausdruck

    (double)point[i] << (string)szBuffer nicht. Fehlermeldung: Keine geeignete Konvertierung gefunden bzw. kein linksseitiger Operand bekannt der double akzeptiert. Das heisst jetzt für mich dass ich den Operanden selbst definieren muss?

    Oder gibt es eine schönere elegantere Methode, z.B. vielleicht doch mit alten C-Methoden zu arbeiten?



  • Und wo kommt generell der Ausdruck "(double)point[i] << (string)szBuffer" her? In Deinem Ursprungsbeispiel ist er jedenfalls nicht zu finden (und ist so auch ziemlicher Quatsch).

    Es sollte eigentlich problemlos gehen wie Du im Ursprungspost dargestellt hast, von dem Komma mal abgesehen. Das müsstest Du nach jeder Eingabe manuell einlesen (evtl. mit ifstream::peek() und ifstream::ignore() bis wieder eine Ziffer kommt)



  • also das mit (double) und (string) war nur als Beispiel um zu zeigen welche typen das sind. Sorry, war verwirrend

    O.k., so wie ich es in meinem Anfangspost drin habe funktioniert es nicht mit eben der Begründung, dass es keinen linksseitigen Operator gibt der double akzeptiert bzw. keine Konvertierung bekannt ist. Also entweder mir fehlt noch ein Header oder da stimmt was anderes nicht.



  • O.k., habs gelöst. Es lag am string. Der >> Operator arbeitet nur mit einem stream, nicht mit einem string.

    Danke für eure Tipps.



  • Schon mal was von Stringstreams gehört?



  • guest08 schrieb:

    ich habe ein (wahrscheinlich triviales) Problem. Ich habe ein .txt file und möchte daraus double Werte einlesen, z.B.:

    23.45, 32454.23, 1.0
    23.55, 32457.98, 2.0
    ......

    Ich habe im Hinterkopf dass es eine Möglichkeit gibt das ganze über den << operator einzulesen

    der operator>> ist die richtige Wahl. Falls das, was Du liest, Punkte sein sollen, so bietet es sich an zunächst eine struct (oder class) 'Punkt' zu erstellen. Dieser struct wird dann eine operator<<-Funktion verpasst, mit der man genau einen Punkt einlesen kann. Also das Ziel ist es:

    Punkt p1;
        ifstream file( "input.txt" );
        file >> p1; // einen Punkt lesen
    

    Wenn es mehr als ein Punkt wird, so packt man "viele" Elemente - in diesem Fall Punkte - in einen Container, z.B. einen vector - also:

    vector< Punkt > punkte;
    

    Den vector kann man dann auch direkt aus dem File füllen. Bleibt noch das Problem mit dem Komma zwischen den Zahlen (ohne wär's einfacher). Alles zusammen sieht so aus:

    #include <iostream>
    #include <vector>
    #include <iterator> // istream_iterator
    #include <fstream>
    
    std::istream& komma( std::istream& in )
    {
        char k;
        if( in >> k && k != ',' )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    
    struct Punkt // ein Punkt
    {
        // -- einen Punkt mit seinen Koordinaten einlesen
        friend std::istream& operator>>( std::istream& in, Punkt& pkt )
        {   // Format: "x, y, z"
            return in >> pkt.m_koord[0] >> komma >> pkt.m_koord[1] >> komma >> pkt.m_koord[2];
        }
        double m_koord[3];
    };
    
    int main()
    {
        using namespace std;
        ifstream file( "input.txt" );
        vector< Punkt > punkte( (istream_iterator< Punkt >( file )), istream_iterator< Punkt >() );
    
        cout << punkte.size() << " Punkte gelesen" << endl;
        return 0;
    }
    

    zum Thema Punkt (oder mathematischer Vektor) in 3D siehe auch hier.
    Gruß
    Werner


Log in to reply