Parameter einlesen



  • Hallo allerseits,

    ich möchte in ein Molekulardynamik-Programm Parameter aus einer Datei einlesen.

    Die Datei sieht etwas so aus:

    collision 0.01

    timestep 0.001

    algorithm 2

    ...

    Bisher hab ich versucht, das ganz über fscanf einzulesen aber mit zunehmender Parameterlänge funktioniert das ganze nicht mehr so sonderlich toll.

    Habe es bisher (für obiges Beispiel) auf folgende Art und Weise versucht:

    fscanf(f_open, "%s %lf %s %lf %s %d", collision, &nu, timestep, &dt, Algor, &algorithm);

    Gibt es dafür eine bessere Lösung? Am besten eine Lösung die das ganze Zeilenweise durchgeht. Mit fgets komm ich nicht so wirklich klar, da mir das ja einfach nur die ganze Zeile speichert und ich ja nur die Zahlen benötige.

    Vielen Dank schonmal

    Gruß

    Timo



  • hi!
    ja, es gibt ne bessere lösung. eine gute ist, wenn du dir dein dateiformat selbst bestimmst. dann kannst du auch ruhigen gewissens fcanf benutzen.

    wenn das einlesen zeitkritisch ist, also möglichst schnell gehen soll, dann nimm fread in verbindung mit struktur-blöcken.

    MfG



  • Und wie bestimme ich mein Dateiformat selbst? Möchte auf jeden Fall kein Binärformat benutzen, da ich die Parameter im Parameterfile ändern möchte.



  • hmm..also, ich denke mal, dein parameterfile bestimmt dein format, oder?
    ansonsten:
    je nachdem, wie dein programm ablaufen muss, ergibt sich dein dateiformat.
    da ich nichts über dein programm weiss, kann ich nur so allgemeine tipps geben.

    am einfachsten wäre eine konstante anzahl der parameter. 'überschüssige' parameter könnten nullwerte erhalten, die brauchbaren liest du dann aus.
    ist dies nicht möglich, siehe 2)

    variable parameterwerte
    z.b.
    collision 1 2 3 // Drei Parameter
    timestep 0.001 // 1 Parameter
    algorithm 4 5 6 7 // 4 Parameter

    hier müsstest du erst den 'alias' einlesen und dann entsprechend den formatstring für fsanf setzten.

    z.b.
    char* fmt;
    if ( strcmp ( "collision" == 0 ))
    fmt = "%d %d %d\n"; // format für eine zeile festlegen

    //... fscanf ( fp, fmt, &a, &b, &c );
    usw.
    🙂



  • Also ich hab eigentlich, bis auf eine Variable nur jeweils einen Parameter.

    Ich lese meine Datei doch erst ganz normal über fopen ein, oder?
    Allerdings hab ich die if-schleife noch nicht so wirklich verstanden, da die ja nicht wirklich auf die Datei zuzugreifen scheint.

    Ich würde ja gerne mein Parameterfile anhängen, aber ich finde hier keinen Attachment-Button oder so. Deswegen mal hier so als Textversion:

    MD-Simulation-Config
    
    Algorithm(V=0,VV=1,LF=2) 0
    
    Unitcell= 5 5 5
    
    Density 0.8
    
    timestep 0.001
    
    NVTsimulation_length1 0
    
    NVEsimulation_length1 1000
    
    NVTsimulation_length2 0
    
    NVEsimulation_length2 0
    
    Collisionratio 0.01
    
    StartingTemperature 1.25
    
    BoltzmannConstant 0.00198657
    
    ASCII 1
    
    XMGRACE 1
    

    🙂 Danke für die Hilfe



  • ja, mit fopen ... die if-schleife war mehr oder weniger nur pseudocode.
    ich gehe mal davon aus, das dein parameter-file immer den gleichen aufbau bezüglich der reihenfolge hat? ein konkreter dateizugriff kann dan so aussehen:

    while ( !feof(fp) )
    {
    fscanf ( fp, "Algorithm(V=0,VV=1,LF=2) %d\n", &Algorithm );
    	fscanf ( fp, "Unitcell= %d %d %d\n", &Unitcell_a, &Unitcell_b, &Unitcell_c );
    //... weitere Parameter einlesen ...
    // ...
    }
    

    🙂



  • Super. Danke! So funktionierts. Kannte feof bisher noch nicht.

    Grüße

    Timo


Log in to reply