Gezieltes Einlesen einer Datei !!!!!!



  • Hallo
    Ich möchte nur die richtigen Werte einlesen. Ich hab in den Kommentaren geschrieben welche ich genau möchte

    [C-Leute]
    * Kommentar
    C  8  6  50.0                  //Darf eingelesen werden
    C  3 50  20                    //Darf eingelesen werden
    C  4  4  40.0                  //Darf eingelesen werden
    * C 42 42 24                   //Darf NICHT eingelesen werden
    C 42  6  60                    //Darf eingelesen werden
    C  1 11  15 ; C 123 23 45      //Darf "C  1 11  15" eingelesen werden ABER "C 123 23 45" nicht
    .END                           //Danach darf NIX mehr eingelesen werden
    C 41 42  43                    //Darf NICHT eingelesen werden
    

    Ich schaff es die Daten einzulesen die nur mit "C" anfangen aber er ließt auch die Werte ein die davor ein Sonderzeichen haben. z.B. "* C 42 42 24 " und "; C 123 23 45"
    Und ich weiss nicht wie ich das Ende ".END" deklarieren kann damit danach nix mehr eingelesen werden kann.

    Folgendes habe ich bereits.

    struct C_Liste
    {
        int    stru_Wert1;
        int    stru_Wert2;
        double stru_Wert3;
    };
    
    int BlaBla(FILE*Datei)
    {
        char Zeichen[20];
    
        while ((*Zeichen=fgetc(Datei)))
        {
            if (*Zeichen != 'C')
            {
                    fscanf(Datei, "%*[^\n C]");
            }else
                {
                    return 1;
                }
    
        }return 0;
    };
    
    void fscan_Liste(FILE* Datei,struct C_Liste* Z_Lesen)
    {
    
        for (int j=0; j<=Anzahl; j++)
        {
            BlaBla(Datei);
            fscanf(Datei, "%i%i%lf", &Z_Lesen->stru_Wert1, &Z_Lesen->stru_Wert2, &Z_Lesen->stru_Wert3);
            Z_Lesen++;
        }
    
    }
    

    Bitte nur konstruktive Vorschläge und Anregungen 🙂

    Danke



  • Du kannst z.B. zeilenweise (mit fgets ) lesen und dann in aller Ruhe die Entscheidungen treffen.

    Das Ende kannst du dann mit strncmp oder strstr suchen und dann die Leseschleife beenden.

    Die Werte kannst du dann mit sscanf auslesen.



  • Was sind denn das für Daten?

    Okay

    [blabla]
    

    beginnt irgendeine Gruppierung, die von

    .END
    

    beendet wird. Richtig?

    *
    

    und

    //
    

    starten einen Kommentar - alles bis zum Zeilenende wird ignoriert.

    C Zahl Zahl Zahl
    

    beschreibt ein Objekt. Was?
    Und

    C Zahl Zahl Zahl ; C Zahl Zahl Zahl
    

    bedeutet was?
    Sind das immer floats oder immer ints? Floats und ints gemischt? Zwei ints, dann ein float? Was?

    Dich interessieren nur Objekte innerhalb einer 'Gruppierung'. Und es gibt nur C... Objekte, nicht auch noch L... Objekte, oder XYZ... Objekte?

    Mir fiele es leichter Dir zu helfen, wenn das Kind einen Namen hätte.



  • Ja ".END" heisst das ab dort nix mehr eingelesen werden darf

    Einlesen möchte ich nur die "C 4 6 20.00" Werte. Das sind die 2 Int Werte und 1 float Wert. Sieht man doch auch hier

    fscanf(Datei, "%i%i%lf", &Z_Lesen->stru_Wert1, &Z_Lesen->stru_Wert2, &Z_Lesen->stru_Wert3);
    

    Sobald das "C" ein Sonderzeichen davor hat darf es nicht eingelesen werden.
    Deswegen darf bei der Zeile

    C  1 11  15 ; C 123 23 45      //Darf "C  1 11  15" eingelesen werden ABER "C 123 23 45" nicht
    

    Nur "C 1 11 15" eingelesen werden.

    DirkB schrieb:

    Du kannst z.B. zeilenweise (mit fgets ) lesen und dann in aller Ruhe die Entscheidungen treffen.

    Das Ende kannst du dann mit strncmp oder strstr suchen und dann die Leseschleife beenden.

    Die Werte kannst du dann mit sscanf auslesen.

    Ich weiss das es auch diese Befehle dafür gibt aber ich weiss nicht wie ich sie einbinden soll. 😡



  • Dein pubertäres "!!!!!!" im Titel kannst du dir schenken.
    Das animiert hier niemanden dir zu helfen, im Gegenteil.

    - du liest einfach zeilenweise mit fgets
    - diesen String auswerten mit sscanf:
    -- Endebedingung ist: ".END" als erstes Wort kommt in der Zeile vor
    -- wenn erstes Wort "C" ist, wertest du 3 folgende numerische Werte aus

    Das ist alles trivial und absolutes Anfängerniveau.

    char zeile[1000],wort[1000];
    int i,j; double d;
    FILE *f = fopen(...,"r");
    
    while(fgets(zeile,1000,f))  /* JEDE Zeile lesen */
    {                           /* und auswerten */
      if( sscanf(zeile,"%s",wort),!strcmp(wort,".END") )
        break; /* Abbruchbedingung */
      if( 4==sscanf(zeile,"%s%d%d%lf",wort,&i,&j,&d) && !strcmp(wort,"C") )
        printf("\nErfolgreich gelesen: %d %d %f",i,j,d);
      ...
    }
    
    fclose(f);
    


  • Wutz schrieb:

    Dein pubertäres "!!!!!!" im Titel kannst du dir schenken.
    Das animiert hier niemanden dir zu helfen, im Gegenteil.

    - du liest einfach zeilenweise mit fgets
    - diesen String auswerten mit sscanf:
    -- Endebedingung ist: ".END" als erstes Wort kommt in der Zeile vor
    -- wenn erstes Wort "C" ist, wertest du 3 folgende numerische Werte aus

    Das ist alles trivial und absolutes Anfängerniveau.

    Ok ich wusste nicht das hier nur Fragen für Fortgeschrittene geklärt werden und man keine leichten Fragen stellen darf. Das nächste mal frag ich einfach wo anders nach.
    Trotzdem Vielen Dank es hat mir sehr geholfen.



  • tante123 schrieb:

    Ja ".END" heisst das ab dort nix mehr eingelesen werden darf

    Einlesen möchte ich nur die "C 4 6 20.00" Werte. Das sind die 2 Int Werte und 1 float Wert. Sieht man doch auch hier

    fscanf(Datei, "%i%i%lf", &Z_Lesen->stru_Wert1, &Z_Lesen->stru_Wert2, &Z_Lesen->stru_Wert3);
    

    Sobald das "C" ein Sonderzeichen davor hat darf es nicht eingelesen werden.

    Du hast mich missverstanden. Ich wollte wissen, was das für Daten sind (Temperaturen/Positionen/Farben/Geldbeträge/...). Du paraphrasierst nur, was Du schon im Eingangspost geschrieben hast.

    Ob es jetzt nur * oder auch // Kommentare gibt weiss ich immer noch nicht.
    Auch was die Zeile mit dem ';' bedeutet weiss ich immer noch nicht.
    Gibt es mehrere '[xyz]' ... '.END' Blöcke? usw. usf.

    Naja: Du hast ja mittlerweile einige Vorschläge bekommen.


Anmelden zum Antworten