Datei einlesen



  • Danke, hat geklappt. Damit wäre jetzt die Tabelle eingelesen. 🙂
    Wenn ich noch Fragen habe melde ich mich, aber erstmal müsste es ausreichen. 😉



  • Ich bin's nochmal:
    Das Programm läuft soweit, aber ich kann damit noch nicht wirklich arbeiten. Denn ich bräuchte ein Feld welches alle eingelesenen Werte beinhaltet. Ich hab es mit mehreren Varianten von Feldern versucht, aber es klappt leider nie. Da es gleichzeitig mit den Feldern hochzählen muss, aber die vorhandene for-Schleife nach 14 Feldern wieder von vorne anfängt.

    Hat jemand dazu eine Idee wie man alle eingelesenen Werte abspeichern kann?



  • Hast du noch eben deinen aktuellen Quellcodestand?



  • Das ist er:

    #include <vector>
    #include <limits>
    #include <fstream>
    #include <iostream>
    
    struct Streicher
    {
        friend std::istream& operator>>( std::istream& in, Streicher& s );
        std::vector< double > m_data;
    };
    
    std::istream& skipline( std::istream& in )
    {
        return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); // erfordert #include <limits>
    }
    
    std::istream& operator>>( std::istream& in, Streicher& s )
    {
        s.m_data.clear(); // erst mal löschen, falls noch was drin stand
        in >> skipline; // Zeile 1 überlesen
        for( int zl=2; zl<=4; ++zl ) // Zeilen 2 bis 4
        {
            double d;
            for( int i=0; i<(zl==4? 4: 5) && in >> d; ++i ) // in Zeile 2 und 3 fünf und in Zeile 4 drei Werte lesen
                s.m_data.push_back( d );
            in >> skipline; // den Rest der Zeile überlesen (Ziffern 2,3,4)
        }
        return in;
    }
    
    int main()
    {
        using namespace std;
        ifstream file("input.txt");
    
        if( !file.is_open() )
        {
            cerr << "Datei kann nicht geoeffnet werden" << endl;
            return -1;
        }
        file >> skipline >> skipline; //Überspringen der ersten beiden Zeile
        for( Streicher s; file >> s; )
        {
            // mache was mit 's'
            cout << s.m_data[0] << " ... " << s.m_data[13] << endl;
        }
        return 0;
    }
    


  • Wieso speicherst du nicht das 's' ab?

    vector<Streicher> vec;
    for( Streicher s; file >> s; ) vec.push_back(s);
    


  • Weil ich den Befehl nicht gekannt habe. Wie soll ich das in das Programm einbinden?



  • Streicher schrieb:

    Weil ich den Befehl nicht gekannt habe. Wie soll ich das in das Programm einbinden?

    .. mh - bei Dir fehlen noch ziemlich viele Grundlage. Also Du änderst das main()-Programm so:

    int main()
    {
        using namespace std;
        vector<Streicher> alleStreicherElemente;
    
        ifstream file("input.txt");
        if( !file.is_open() )
        {
            cerr << "Datei kann nicht geoeffnet werden" << endl;
            return -1;
        }
        file >> skipline >> skipline; //Überspringen der ersten beiden Zeile
        for( Streicher s; file >> s; )
        {
            alleStreicherElemente.push_back( s ); // hier das gerade gelesene Element des Typs Streicher im Container aufnehmen
        }
        cout << alleStreicherElemente << " Elemente gespeichert" << endl;
        return 0;
    }
    

    Was willst Du denn dann mit den Daten machen und sind dass auch die Daten, die Du benötigst? Vielleicht verrätst Du uns was das Programm wirklich konkret tun soll, dann kann man auch besser helfen.

    Gugelmoser schrieb:

    Hast du noch eben deinen aktuellen Quellcodestand?

    Streicher schrieb:

    Das ist er:

    ...
    

    das ist der Quellcode, den ich gepostet habe, interessanter wäre der Teil, bei dem Du mit den Daten arbeitest. Nur davon ist es letztlich abhängig, wie z.B. die struct Streicher genau aussehen muss.

    :xmas2: Werner



  • Also ich muss aus der Datei die Zahlen der einzelnen Elemente einlesen. Soweit funktioniert ja auch schon das Programm. Ich muss aber später mit diesen Zahlen Rechnungen durchführen. Die Rechnung lautet z.B. R = a1 + a2 * T
    Dabei ist T bekannt und a1 und a2 sind Werte die ich zuweisen muss und die in der Tabelle stehen.
    Daher hab ich mir gedacht, dass ich sie alle in Felder reinschreibe, so dass ich sie dann einfach durch Feld[i] aufrufen kann und dann damit rechnen kann.

    Ich hoffe es ist klarer geworden.



  • Eigentlich kannst du das jetzt doch auch, nur dass es eben überschaubarer ist, aufgrund zweier Dimensionen. Außgehend von Werners letztem Beitrag kannst du einfach schreiben:

    R = alleStreicherElemente[welches s?][0....13] + alleStreicherElemente[welches s?][0....13] * T;
    

    Willst du also wirklich ein eindimensionales Feld?



  • Von mir aus kann es auch eine Matrix sein in der dann alle 14 Werte eine neue Zeile/Spalte dazukommt, so dass es bisschen mehr Struktur hat. Dachte nur das mit dem Feld ist einfacher zuprogrammieren.



  • Streicher schrieb:

    Also ich muss aus der Datei die Zahlen der einzelnen Elemente einlesen. Soweit funktioniert ja auch schon das Programm. Ich muss aber später mit diesen Zahlen Rechnungen durchführen. Die Rechnung lautet z.B. R = a1 + a2 * T
    Dabei ist T bekannt und a1 und a2 sind Werte die ich zuweisen muss und die in der Tabelle stehen.
    Daher hab ich mir gedacht, dass ich sie alle in Felder reinschreibe, so dass ich sie dann einfach durch Feld[i] aufrufen kann und dann damit rechnen kann.

    Ich hoffe es ist klarer geworden.

    Na ja - wo stehen die Werte a1 und a2? was passiert mit R nachdem es berechnet wurde und ist T immer konstant für alle a1 und a2?
    :xmas2: Werner



  • Streicher schrieb:

    Von mir aus kann es auch eine Matrix sein in der dann alle 14 Werte eine neue Zeile/Spalte dazukommt, so dass es bisschen mehr Struktur hat. Dachte nur das mit dem Feld ist einfacher zu programmieren.

    .. einfach zu programmieren ist ein Container mit Strukturen wie z.B.:

    vector< Streicher > alleStreicherElemente
    

    das wäre im Prinzip die Tabelle, die Du wahrscheinlich brauchst (s.o.).
    :xmas2: Werner



  • Werner Salomon schrieb:

    Streicher schrieb:

    Also ich muss aus der Datei die Zahlen der einzelnen Elemente einlesen. Soweit funktioniert ja auch schon das Programm. Ich muss aber später mit diesen Zahlen Rechnungen durchführen. Die Rechnung lautet z.B. R = a1 + a2 * T
    Dabei ist T bekannt und a1 und a2 sind Werte die ich zuweisen muss und die in der Tabelle stehen.
    Daher hab ich mir gedacht, dass ich sie alle in Felder reinschreibe, so dass ich sie dann einfach durch Feld[i] aufrufen kann und dann damit rechnen kann.

    Ich hoffe es ist klarer geworden.

    Na ja - wo stehen die Werte a1 und a2? was passiert mit R nachdem es berechnet wurde und ist T immer konstant für alle a1 und a2?
    :xmas2: Werner

    Ja ich muss mit R noch weiterrechnen. Es folgen noch einige Rechenschritte aber ich brauch danach nichts mehr aus der Tabelle. Die brauch ich nur einmal.
    T ist immer konstant.



  • .. und wo genau stehen a1 und a2 in der Tabelle? :xmas1:



  • Da das zuvor nur ein Bsp war sagen wir die ersten beiden stellen.

    Schlussendlich brauch ich die ersten 5 werte sowie die 8. bis 12. Werte. Es wird eben immer komplizierter so, daher dachte ich , dass man alle einliest und man dann einfach die rauspickt, die man für die Rechnung braucht.



  • Streicher schrieb:

    Da das zuvor nur ein Bsp war sagen wir die ersten beiden stellen.

    Schlussendlich brauch ich die ersten 5 werte sowie die 8. bis 12. Werte. Es wird eben immer komplizierter so, daher dachte ich , dass man alle einliest und man dann einfach die rauspickt, die man für die Rechnung braucht.

    Jedes Streicher-Element enthält die 14 Werte aus einem Eintrag. So wie Gugelmoser schon vorgeschlagen hat, kannst Du jedes mal wenn ein Element gelesen wurde, die von Dir gewünschten Rechnungen durchführen. Etwa in der Art:

    // .. ab Zeile 13 vom meinem letzten Posting
        for( Streicher s; file >> s; )
        {
            R = alleStreicherElemente.m_data[0] + alleStreicherElemente.m_data[1] * T; // R = a1 + a2 * T
            // und hier mit R weiter arbeiten .. oder weitere Rechnungen durchführen
        }
    

    und ist jetzt noch irgendwas unklar?

    :xmas2: Werner



  • Hab ich nicht dann wieder das Problem, dass das R immer überschrieben wird?



  • Streicher schrieb:

    Hab ich nicht dann wieder das Problem, dass das R immer überschrieben wird?

    Dann musst du R eben auch in einem Container ablegen. 😉



  • Wenn es mehr nicht ist...hab aber im moment eher in Problem mit eurem Vorschlag, denn es kommt für die Zeile:

    R = alleStreicherElemente.m_data[0] + alleStreicherElemente.m_data[1] * T; // R = a1 + a2 * T
    

    Folgender Fehler:

    error: 'class std::vector<Streicher, std::allocator<Streicher> >' has no member named 'm_data'
    


  • Streicher schrieb:

    Wenn es mehr nicht ist...hab aber im moment eher in Problem mit eurem Vorschlag, denn es kommt für die Zeile:

    R = alleStreicherElemente.m_data[0] + alleStreicherElemente.m_data[1] * T; // R = a1 + a2 * T
    

    Folgender Fehler:

    error: 'class std::vector<Streicher, std::allocator<Streicher> >' has no member named 'm_data'
    

    Da fehlt eine Dereferenzierung: :p

    int main()
    {
        using namespace std;
        vector<Streicher> alleStreicherElemente;
    
        ifstream file("input.txt");
        if( !file.is_open() )
        {
            cerr << "Datei kann nicht geoeffnet werden" << endl;
            return -1;
        }
        file >> skipline >> skipline; //Überspringen der ersten beiden Zeile
        for( Streicher s; file >> s; )
        {
            alleStreicherElemente.push_back( s ); // hier das gerade gelesene Element des Typs Streicher im Container aufnehmen
        }
    
        // ...
        vector<double> results;
        R = alleStreicherElemente[2].m_data[5] + alleStreicherElemente[1].m_data[13] * T; // 6. Wert aus der 3. Wertgruppe + 14. Wert aus der 2. Wertgruppe * T
        results.push_back(R);
        //...
    
        return 0;
    }
    

Anmelden zum Antworten