Zahlen aus Textdatei auslesen und in Integer speichern ?



  • Hallo,

    ich würde gerne eine Textdatei auslesen, welche komplett aus Zahlen und Trennzeichen besteht und die Zahlen dann auch als solche verwenden können und nicht als character.

    Meine Textdatei sieht z.B. folgendermaßen aus:

    12;255;8;19;23;177
    189;176;24;19:199

    gespeichert werden sollte das dann am besten in einem int array, so dass ich auf die einzelnen Zahlen zugreifen kann.

    z.B.:
    int zahl[255];

    .../hier der entsprechende Quelltext/...

    cout<<zahl[0]<<endl;
    cout<<zahl[1]<<endl;
    cout<<zahl[2]<<endl;
    cout<<zahl[3]<<endl;

    Die Ausgabe sollte dann so aussehen:

    12
    255
    8
    19

    lässt sich sowas auf irgendeine Art und Weise realisieren ?
    Brauche sowas unbedingt für mein Studium.

    Schonmal Danke für Eure Hilfe !

    MfG
    Carsten



  • string
    string::find_first_of(const char*) ";"
    string::substr(int offset,int count);

    strtod() (ich glaub das triffts am besten wenn du keinerlei whitespaces zwischen den zahlen hast)

    strtol()
    strtoul()

    das sollten alles hilfreiche mittel sein ^^



  • CarstenH schrieb:

    Meine Textdatei sieht z.B. folgendermaßen aus:

    12;255;8;19;23;177
    189;176;24;19:199

    Es ist immer ungünstig, Semikolon oder ähnliches als Trenner bei Zahlen zu benutzen. Besser sind schlicht Leerzeichen.

    CarstenH schrieb:

    .. das dann am besten in einem int array, so dass ich auf die einzelnen Zahlen zugreifen kann.

    z.B.:
    int zahl[255];

    Besser: std::vector< int > zahl;

    Das ganze könnte so aussehen:

    #include <iostream>
    #include <fstream>
    #include <algorithm>    // copy
    #include <iterator>     // ostream_iterator
    #include <vector>
    
    std::istream& semikolon_opt( std::istream& in )
    {
        std::istream::sentry ok( in );
        if( ok )
        {
            char c = std::istream::traits_type::to_char_type( in.rdbuf()->sgetc() );
            if( c == ';' )
                in.rdbuf()->sbumpc(); // Zeichen konsumieren
        }
        return in;
    }
    
    int main()
    {
        using namespace std;
        vector< int > zahl;
        ifstream file("input.txt");
        for( int i; file >> semikolon_opt >> i; )
            zahl.push_back( i );
        cout << zahl.size() << " Zahlen gelesen " << endl;
    
        // -- Zugriff z.B.:
        int b = zahl[0];
    
        // --   Ausgabe
        copy( zahl.begin(), zahl.end(), ostream_iterator< int >( cout, "\n" ) );
        return 0;
    }
    

    Gruß
    Werner



  • Hui, das ist ja doch aufwendiger als ich dachte !!

    also ich lese die Textdatei folgendermaßen ein:

    ifstream Textdat_1;
    Textdat_1.open("C:\\test.txt");
    while(klar[i]!=EOF)
    {
    i++;
    klar[i] = Textdat_1.get();
    }

    Textdat_1.close();

    hatte gehofft, das ginge nun mit einem einfachen 3 zeiler oder so, dass aus meinem array "klar" einfach ein int array wird, in dem alle Zahlen gespeichert sind.

    Aber dennoch danke für die Hilfe, ich werd das mal versuchen mit Deinem Quelltext...allerdings befürchte ich, dass mir das doch zu kompliziert ist 😮

    ein leerzeichen als trennzeichen wäre kein problem... ginge es damit leichter ?

    MfG
    Carsten



  • CarstenH schrieb:

    hatte gehofft, das ginge nun mit einem einfachen 3 zeiler oder so

    das sind nur drei Zeilen 😉 ; um genau zu sein, die Zeilen 23-25 in dem von mir geposteten Code.

    CarstenH schrieb:

    ein leerzeichen als trennzeichen wäre kein problem... ginge es damit leichter ?

    Ja, Du kannst dann alles weglassen, wo semikolon_opt dran steht; also die Funktion oben (Zeilen 7-17) und aus Zeile 24 wird:

    for( int i; file >> i; )
    

    oder es ginge noch einfacher: statt der Zeilen 22-25 schreibt man einfach

    ifstream file("input.txt");
        vector< int > zahl( (istream_iterator< int >( file )), istream_iterator< int >() );
    

    Gruß
    Werner



  • Juhu, perfekt, danke !!!
    Funktioniert 👍

    🙂 🙂 🙂

    MfG
    Carsten


Anmelden zum Antworten