Config auslesen und in Struktur schreiben



  • Hi,
    ich habe an meinem aktuellen Projekt ein Problem.
    Ich habe eine config Datei (config.3dsim) welche folgendermassen aussieht:

    [P1]
    Masse = 1000
    X = 100
    Y = 0
    Z = 0
    VX = 0
    VY = 0
    VZ = 0
    [P2]
    Masse = 500
    X = 0
    Y = 0
    Z = 0
    VX = 0
    VY = 0
    VZ = 0
    [P3]
    Masse = 100
    X = 0
    Y = 0
    Z = 0
    VX = 0
    VY = 0
    VZ = 0
    

    P1,P2,P3 sind die Strukturen in die ich dann die folgenden Werte einlesen will.
    Danach soll zum Beispiel in "P1.m" (Masse) 1000 stehen.

    struct Satellite { 
    	double xlenght; 
    	double ylenght; 
    	double zlenght; 
    	double r; 
    	double vx; 
    	double vy; 
            double vz;
    	double ax; 
    	double ay; 
    	double m;
    }P1, P2, P3;
    

    das ist noch die Struktur

    Nun ich hoffe ihr könnt mir da etwas effektives Vorschlagen
    Gruss

    Lukas



  • Um von Dateien zu lesen oder in sie zu schreiben, gibt es std::fstream . Mit operator>> kannst du einzelne Teile auslesen und in Variablen speichern.

    Eine genauere Erklärung und Beispielcode findest du unter www.cplusplus.com.



  • Hallo Lukas,

    ich unterstelle mal, dass X,Y und Z den Membern x-,y-,zlenght entsprechen. Dann sähe die Minimallösung so aus:

    #include <iostream>
    #include <fstream>
    #include <limits>
    
    struct Satellite {
        double xlenght;
        double ylenght;
        double zlenght;
        double r;
        double vx;
        double vy;
            double vz;
        double ax;
        double ay;
        double m;
    };
    
    std::istream& operator>>( std::istream& in, Satellite& sat )
    {
        const std::streamsize ALL = std::numeric_limits< std::streamsize >::max();
        return ((((((in.ignore( ALL, '=' ) >> sat.m)
            .ignore( ALL, '=' ) >> sat.xlenght).ignore( ALL, '=' ) >> sat.ylenght).ignore( ALL, '=' ) >> sat.zlenght)
            .ignore( ALL, '=' ) >> sat.vx).ignore( ALL, '=' ) >> sat.vy).ignore( ALL, '=' ) >> sat.vz;
    }
    
    int main()
    {
        using namespace std;
        ifstream file( "input.txt" );
        Satellite P1, P2, P3;
        if( file >> P1 >> P2 >> P3 )
            cout << "3 Satelliten gelesen " << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Herzliches Dankeschön
    Das funktioniert perfekt.
    Noch einen schönen Abend
    Gruss

    Lukas


Anmelden zum Antworten