Dyn. Felder und Einlesen von Zahlen aus einer Datei



  • Hi,

    ich möchte ein Feld mit Parametern aus einer Datei aufspannen. Wie geht das unter C++?

    Zudem möchte ich Wertepaare aus einer Datei einlesen. Mit Fortran werden die Tabs oder Leerzeichen automatisch herausgefiltert. ABer wie geht das in C? Muss ich mir dazu selbst eine Funktion basteln.

    Bsp.:

    0.000 0.000
    0.005 0.012
    0.010 0.120

    Vielen Dank für Eure Hilfe und Ideen.

    Gruß,

    W2K2005



  • *lol*



  • W2K2005 schrieb:

    Hi,

    ich möchte ein Feld mit Parametern aus einer Datei aufspannen. Wie geht das unter C++?

    Beispiel:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream in("data.txt");
        if(!in)
        {
            cout << "\n an error occured\n";
            return 1;
        }
        unsigned int x, y;
        // x, y Koordinate aus Datei lesen.
        in >> x >> y;
    
        // dynamisch einen vektor[x][y] von 'Hand' anlegen
        int* vec = new int*[x]; 
        for(unsigned int i = 0; i < x; ++i)
              vec[i] = new int[y];
    
        ....
        // Speicher wieder freigeben!
    }
    

    Zudem möchte ich Wertepaare aus einer Datei einlesen. Mit Fortran werden die Tabs oder Leerzeichen automatisch herausgefiltert. ABer wie geht das in C? Muss ich mir dazu selbst eine Funktion basteln.

    Bsp.:

    0.000 0.000
    0.005 0.012
    0.010 0.120

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        ifstream in("data.txt");
        vector<double> v;
        if(in)
        {
              double tmp;
              while(getline(in, tmp)) // Solange Datei gelesen werden kann.
                    v.push_back(tmp); // Daten in vector speichern
        }
        ....
    }
    


  • Vielen Dank.

    Kannst Du mir noch saen, wie ich den Speicher am Ende wieder freigebe?

    Angenommen ich würde die dynamische Allokation eines Feldes unter C durchführen wollen, wie müsste ich dort vorgehen.

    Gruß,

    W2K2005



  • W2K2005 schrieb:

    Vielen Dank.

    Kannst Du mir noch saen, wie ich den Speicher am Ende wieder freigebe?

    Unter C++:
    Jeden Speicher den du mit new reservierst solltest du mit delete wieder freigeben.
    Jeden Speicher den du mit new*[]* reservierst solltest du mit delete*[]* wieder freigeben.

    Bezogen auf obiges (erstes) Beispiel sieht die Speicherfreigabe so aus:

    ....
    for(unsigned int i = 0; i < x; ++i)
          delete[] vec[i];
    delete[] vec;
    

    Angenommen ich würde die dynamische Allokation eines Feldes unter C durchführen wollen, wie müsste ich dort vorgehen.

    Beispiel:

    int main()
    {
          // Speicher für 10 * sizeof(int) reservieren. (D.h. auf einem 32-Bit System 40 Byte Speicher reservieren...)
          int* ptr = (int*) malloc(10 * sizeof(int));
    
          // do something with ptr...
    
          free(ptr); // Speicher wieder freigeben.
    
          // ...
    }
    

    Diese Infos kannst du jedoch auch in einem Buch/Tutorial deiner Wahl nachschlagen.

    Caipi



  • W2K2005 schrieb:

    Zudem möchte ich Wertepaare aus einer Datei einlesen. Mit Fortran werden die Tabs oder Leerzeichen automatisch herausgefiltert. ABer wie geht das in C? Muss ich mir dazu selbst eine Funktion basteln.

    Mit C++ geht das genauso.

    0.000 0.000
    0.005 0.012
    0.010 0.120

    In C++ kannst Du die Mittel aus der STL nutzen:

    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <algorithm>    // copy
    #include <iterator>     // istream_iterator
    
    struct Paar
    {
        double m_x;
        double m_y;
    };
    
    std::istream& operator>>( std::istream& in, Paar& p )
    {
        return in >> p.m_x >> p.m_y;
    }
    
    int main()
    {
        using namespace std;
        vector< Paar > v;
        copy( istream_iterator< Paar >( ifstream("input.txt") ), istream_iterator< Paar >(),
            back_inserter( v ) );
        // Deine Zahlenpaare sind in 'v'
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten