Problem mit sscanf



  • Schönene Guten Tag !

    Ich bins wieder und ich komm leider wieder nicht weiter bei einem Problem.

    und zwar wie vor einigen Tagen habe ich nun eine Programm erstellt mit dem man eine .txt Datei aufrufen kann.
    die txtDatei hat immer den gleichen Aufbau und es sind imemr Werte die ich brauche and er gleichen Position.

    ich bin mir nciht sicher über die sscanf Funktion.
    Also erstmal mein bisheriges Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char datnam[30] = "Götz-Probe.txt";
    
    int main( void )
    {
        FILE * datei;   
        char zeile[80]; 
        char i, str1[5];               //i=Funktion der Dateiüberprüfung
                                       /*str1 ist der Bezug zu den ersten 4 Zeichen
                                         in Zeile 1*/
        datei = fopen( datnam, "r" );  //einlesen der Datei
        if( datei == 0 )               //wenn in der Datei nichts drin ist dann:
        {
            printf("Fehler: Falsche Datei gewaehlt!");
            getchar();
            return 1;
        }
    
                                       //Überprüfung der ersten 4 Zeichen;
        fgets( str1, 5, datei );       //fgets braucht noch einen Bit für nachher
        i = strncmp ( str1 ," RBG", 4);
        if (i != 0)
        {
            printf("Fehler: Falsche Datei gewaehlt!");
            getchar();
            return 1;
        }
    
        fgets( zeile, 79, datei );     //Funktion zeigt die .txt Datei im Dialogfeld an
        while( ! feof(datei) )
        {
            printf("%s", zeile );
            fgets( zeile, 79, datei );
        }
    
        getchar();
        fclose( datei );
        return 0;
    }
    

    und die txt datei wie ich sie aufrufen lassen muss sieht so aus:
    "
    RBG
    Müller
    H.Lang
    18. 3.2008
    950.000000 5300.00000 1080.00000 2410.00000 0.00000000E+00
    19 1 0 0 0 0
    4210.00000 3010.00000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00
    4 3 0 0 0 0
    1 3 9 0 0 0
    1225.00000 1975.00000 2425.00000 0.00000000E+00 0.00000000E+00 0.00000000E+00
    180.000000 0.400000006 0.400000006 2.00000000 2.00000000 50.0000000 0.500000000 0.00000000E+00 3
    Teleskop doppelttief
    "

    jetzt hat die txtDatei 12 Zeilen ich ich brauch bestimmte Werte davon. bpws den Wert 3010.00000 in Zeile 7. und den will ich mir als Variable abspeichern damit cihd amit weiter rechnen kann.

    ich bin eiegntlcih soweit das cih ne variable deklarieren muss natürlich und das ab ich auch als vermutung

    sscanf(zeile,"%g",&dummi1 );  //%e oder %E= double im Format [-]d.ddd e±dd bzw. [-]d.ddd E±dd; %g beste Form aus %f und %e
    

    kann mir da einer helfen? es soll mit sscanf gehen laut meinem prof:)

    Wär echt nett.



  • Dein Problem verstehe ich nicht!!!!!!!!!



  • Hi!
    Du willst aus der Zeile
    4210.00000 3010.00000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E
    den Wert 3010.00000 speichern?
    Nimmst du 6 dummies für sscanf und der zweite bekommt den Wert.

    Gruß,
    B.B.



  • Ja genau!

    so hab ich mri das auch gedacht ..aber wie beziehe ich denn die sscanf funktion auf die 7. Zeile?
    also ich hätte ja für die Zeiel die Funktion

    sscanf(zeile,"%g %g %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi2,&dummi2,&dummi2 );
    

    versteht ihr mein Problem mit dem Bezug ?
    😕



  • sry meine natürlich

    sscanf(zeile,"%g %g %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5 );
    


  • Zähle die Zeilen in der Schleife und wenn deine gewünschte Zeilennummer an der Reihe ist: zack - treten deine dummies in Aktion!



  • ich kapier das irgendwie.
    meinste das so?

    fgets( zeile, 99, datei );     //Funktion zeigt die .txt Datei im Dialogfeld an
        while( ! feof(datei) )         //Funktion nochmal nachgucken!
        {
            if (zeile=6)
            {
            sscanf(zeile,"%g %g %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5 );   //%e oder %E= double im Format [-]d.ddd e±dd bzw. [-]d.ddd E±dd; %g beste Form aus %f und %e
            printf("%g",hoehe);
            }
            printf("%s", zeile );
            fgets( zeile, 99, datei );
        }
    

    wenn das nicht so sien sollte kannste mir mal nen anstaz geben?
    ich sterbe gerade tausend tode 😡



  • Hi habe nochwas probiert aber klappt auch nicht 😞

    fgets( zeile, 99, datei );     //Funktion zeigt die .txt Datei im Dialogfeld an
        while( ! feof(datei) )         //Funktion nochmal nachgucken!
        {
            for( zeile=0, i<20, zeile++)
            if (zeile==7)
            {
            sscanf(zeile,"%g %g %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5 );   //%e oder %E= double im Format [-]d.ddd e±dd bzw. [-]d.ddd E±dd; %g beste Form aus %f und %e
            printf("%g",hoehe);
            break;
            }
            printf("%s", zeile );
            fgets( zeile, 99, datei );
        }
    


  • Du machst aus einen Array eine Zählvariable, das kann nur schiefgehen. Nimm einen extra Zähler für die Zeilen.
    Also, sinngemäß so:

    int zaehler = 0;
    while( ! feof(datei) )
    {
        fgets( zeile, 99, datei );
        zaehler++;
        if(zaehler == ?)
            sscanf(zeile,"%g %g %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5 ); 
    }
    


  • SUPER DANKE!!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char datnam[30] = "SPZ 180 .txt";
    double dummi1, dummi2, dummi3, dummi4, dummi5;
    double hoehe;
    int main( void )
    {
        FILE * datei;  
        int zaehler = 0; 
        char zeile[100]; 
        char i, str1[5];               //i=Funktion der Dateiüberprüfung
                                       /*str1 ist der Bezug zu den ersten 4 Zeichen
                                         in Zeile 1*/
        datei = fopen( datnam, "r" );  //einlesen der Datei
        if( datei == 0 )               //wenn in der Datei nichts drin ist dann:
        {
            printf("Fehler: Falsche Datei gewaehlt!");
            getchar();
            return 1;
        }
    
                                       //Überprüfung der ersten 4 Zeichen;
        fgets( str1, 5, datei );       //fgets braucht noch einen Bit für nachher
        i = strncmp ( str1 ," RBG", 4);
        if (i != 0)
        {
            printf("Fehler: Falsche Datei gewaehlt!");
            getchar();
            return 1;
        }
    
        fgets( zeile, 99, datei );     //Funktion zeigt die .txt Datei im Dialogfeld an
        while( ! feof(datei) )         //Funktion nochmal nachgucken!
        {
            printf("%s", zeile );
            fgets( zeile, 99, datei );
            zaehler++;
            if(zaehler == 6)
            sscanf(zeile,"%g %e %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5);
        }
                printf("\n\n\n%e",hoehe);
    
        getchar();
        fclose( datei );
        return 0;
    }
    

    jedoch hätt ich noch zwei verständnissfragen:

    1.wenn ich zuletzt "hoehe" mit int bei printf ausgeben lasse (und natürlich alle notwenidgen werte dafür änder) erhalte ich das richitge ergebnis, und wenn ich das mit double mache, erhalte ich immer eine exponentialzahl, was ja eigentlich egal sein sollte für mich, da ich die werte ohnehin nur zum rechen brauche. Aaaaaaber ..mir scheints so als sei die double zahl die ich erhalte nicht die richtige 😞
    2.zum verständnis: mit dem zaehler++ der in der schleife ist werden eigentlich nur die zeilen ausgezählt auf die ich dann zugreife mit ? ist das richtig?? 😕



  • Jepp, zaehler++ soll die mit fgets eingelesenen Zeilen zählen. Du musst aber deinen Code noch ergänzen, weil du auch vor der Schleife fgets aufrufst.
    Nach jedem fgets also ein zaehler++.



  • ist also variante 1 oder variante 2 richtig?

    Variante1:

    fgets( zeile, 99, datei ); 
            zaehler++; 
            if(zaehler == 6) 
            sscanf(zeile,"%g %e %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5);
            if(zaehler == 7)
            sscnaf(zeile,"%g %g",&dummi6, &dummi7);
    

    Variante2:

    fgets( zeile, 99, datei ); 
            zaehler++; 
            if(zaehler == 6) 
            sscanf(zeile,"%g %e %g %g %g %g",&dummi1,&hoehe,&dummi2,&dummi3,&dummi4,&dummi5);
            fgets( zeile, 99, datei ); 
            zaehler++; 
            if(zaehler == 7) 
            sscanf(zeile,"%g %g",&dummi6,&dummi7);
    


  • Also ich habe nun Variante ausprobiert und es klappt bloß nun hab ich ein etwas anderen problem ...wemm ich miene Werte als integer deklariere erkennt er bei den größeren über 1000 nur den ersten in einer Zeile. Also hab ichs dann mit double probiert wegen dem exponenten und da erkennt er alle Daten.

    Jedoch!!! schriebt er mir beispielweise für den Wert 4210.00000 (aus der txt Datei) den double Wert 5.76204e-315. Und meine Mahtekenntnisse sagen mir das das nicht das gleiche sien kann 🙄

    kannste mir da vllt weiterhelfen BB?



  • ich hab nunw as probiert und zwar

    i=(int)dummi1;
    

    damit sollte man angeblich aus einem double einen int wert machen,
    klappt bei mri aber nciht da ein anderer wert rauskommt 😞



  • ! schrieb:

    Jedoch!!! schriebt er mir beispielweise für den Wert 4210.00000 (aus der txt Datei) den double Wert 5.76204e-315. Und meine Mahtekenntnisse sagen mir das das nicht das gleiche sien kann 🙄

    ganz klare sache: haste irgendwo nen error, nen bug! 😮


Anmelden zum Antworten