fscanf gibt Muell aus



  • scanf() ist sch* unflexibel, Fehler extrem schwer und aufwendig abzufangen und Wutz hat schon recht - nur, warum tust du dir das an?
    Weil hirnrissig der beste Weg ist, aufs Maul zu fliegen?
    Du hast eine fest vorgegebene Struktur? Erinnert dich das nicht an das Zauberwort "struct"? Du schreibst ja den Kram selbst, hast die Kontrolle darüber, was du schreibst und liest.
    Also struct basteln und binary schreiben/lesen. Du wirst noch genug "Spaß" haben, die Ausgabe zusammenzuschustern.

    Und wenn du schon scharf darauf bist, Runtime und Speicher sinnlos zu verbraten, nähere dich doch bitte über was Simples wie CSV, bis du weißt, was genau deine stdio.h tut. Ich weiß nicht, ob die Implementation der Lib standardisiert ist, meiner Erfahrung nach tendiere ich zu "nicht" - es kommt halt raus, was rauskommt. Portabel ist iwie anders.



  • @sarkast sagte in fscanf gibt Muell aus:

    Also struct basteln und binary schreiben/lesen.

    Gerade das ist

    hirnrissig der beste Weg ist, aufs Maul zu fliegen

    Da nicht portabel und auch schlecht zu kontrollieren.

    @sarkast sagte in fscanf gibt Muell aus:

    Und wenn du schon scharf darauf bist, Runtime und Speicher sinnlos zu verbraten, nähere dich doch bitte über was Simples wie CSV,

    Hat er doch. CSV sind doch "Character-Separated Values". Nur ist der Character hier ein | und kein , oder ;
    Das Problem bleibt also das Gleiche.

    Solange kein Mensch in den Dateien rumfummelt, kann man das mit scanf problemlos lesen - wenn man weiß, was man tut.



  • @dirkb sagte in fscanf gibt Muell aus:

    Solange kein Mensch in den Dateien rumfummelt,

    Nicht ganz, die Datei ist auch hinueber, sobald man was an Daten anfuegt, entfernt oder in der Reihenfolge ändert. Und das dürfte in der Entwicklung eines Spiels recht oft passieren. Aber diese Probleme wurde alle schon gelöst, warum das Rad neu erfinden?



  • @wutz Sind ausgeklammert da dein Vorschlag auch nicht das gewünschte einlaß

    Hab jetzt kapiert was ich falsch gemacht hab.

    Nur hab ich eine Frage:

    if (task == 3){
    printf("Baustelle!\n");

    fp = fopen("SEF-Tabelle-Test.txt", "r"); // öffnen der Datei zum lesen
    
    char z[1000];    //Wofür deklariert man dieses Array?
    int i = 0;
    while( fgets(z,1000,fp) ) //while Schleife mit fgets, läuft bis keine weitere Zeile mehr in der txt Datei steht?
    if (5 == sscanf(z, "%*[^¦]¦¦%49[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%f%*[^¦]¦¦", e[i],&x[i],&y[i],&z[i],&w[i])) //Warum dieses 5== ? 
    printf("Werte: %d und %f\n",z[i],w[i]);
    
    ++i;
    
    fclose(fp);
    

    }

    Kann mir das was das Programm macht jemand in worte fassen, bitte?
    Ich versteh nicht wieso ich das fgets und das sscanf nicht in eine for-Schleife verpacken kann?



  • Wenn ich es so schreibe, wie es für mich sinn macht bzw. ich denke zu verstehen was ich der Reihe nach mache im Programmablauf lest es falsche Werte ein .....

    if (task == 3){
    printf("Baustelle!\n");

    fp = fopen("SEF-Tabelle-Test.txt", "r");
    
    char z[1000];
    int i = 0;
    
    for (int i=0; i <= ANZAHL; i++)
    {
    	fgets(z,1000,fp);
    	sscanf(z, "%*[^¦]¦¦%49[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%f%*[^¦]¦¦", e[i],&x[i],&y[i],&z[i],&w[i]);
    }
    //while( fgets(z,1000,fp) )
    //if (5 == sscanf(z, "%*[^¦]¦¦%49[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%d%*[^¦]¦%f%*[^¦]¦¦", e[i],&x[i],&y[i],&z[i],&w[i])) 
    for (i = 0; i <= ANZAHL; i++)
    {
    	printf("Werte: %d und %f\n",z[i],w[i]);
    }
    
    
    //++i;
    
    fclose(fp);
    

    }



  • @sour-fox sagte in fscanf gibt Muell aus:

    //Wofür deklariert man dieses Array?

    Das Array wird sogar definiert (nicht nur deklariert)
    Irgendwohin muss fgets die Daten ja schreiben.

    @sour-fox sagte in fscanf gibt Muell aus:

    //Warum dieses 5== ?

    Der Rückgabewert von sscanf wird mit 5 verglichen.

    Schaust du bei einer Referenz zu scanf nach. z.B. bei http://www.cplusplus.com/reference/cstdio/scanf/ unter Return Value

    fgets hat übrigens auch einen Rückgabewert, den man auf Fehler überprüfen kann.

    Du kannst in der Einleseschleife auch eine Kontrollausgabe von z machen machen.

    Um die besser helfen zu können, wäre die Datei, die du einlesen möchtest nicht schlecht.
    Und eine genauere Angebe des Fehlers.

    Ach und schau mal im Edit.-Fenster (da wo du die Beiträge schreibst) oben rechts in der Ecke. Da steht VERFASSEN und ein ?.
    Dort steht, wie du Text und Code formatieren kannst.
    Z.B. für Code die drei Backticks ```



  • @dirkb sagte in fscanf gibt Muell aus:

    Z.B. für Code die drei Backticks ```

    Code markieren und auf </> klicken.



  • @swordfish sagte in fscanf gibt Muell aus:

    @dirkb sagte in fscanf gibt Muell aus:

    Z.B. für Code die drei Backticks ```

    Code markieren und auf </> klicken.

    Cool



  • @dirkb Die einzulesende Datei wird vorher erstellt und sieht dann zum Beispiel so aus:

    SEF-Tabelle

    ¦¦============================¦========¦===========¦======¦==========¦¦
    ¦¦ Spielername ¦ Stärke ¦ Erfahrung ¦ Form ¦ SEF-Wert ¦¦
    ¦¦============================¦========¦===========¦======¦==========¦¦
    ¦¦ Robin Strandhagen(C) ¦ 21 ¦ 21 ¦ 95 ¦ 35.80 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Shawn Sarrazin(S) ¦ 16 ¦ 25 ¦ 96 ¦ 33.80 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Konsta Koivu(S) ¦ 15 ¦ 25 ¦ 95 ¦ 33.00 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Julian von Waldstaetten(V) ¦ 19 ¦ 18 ¦ 95 ¦ 34.00 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Andrew Delage(V) ¦ 21 ¦ 19 ¦ 95 ¦ 35.40 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ David Schmidt(C) ¦ 21 ¦ 18 ¦ 95 ¦ 35.20 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Moritz Lenz(S) ¦ 14 ¦ 16 ¦ 95 ¦ 30.60 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Marco Kaufmann(S) ¦ 15 ¦ 19 ¦ 95 ¦ 31.80 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Chandler Soley(V) ¦ 15 ¦ 26 ¦ 99 ¦ 34.00 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Stephen Gillen(V) ¦ 15 ¦ 27 ¦ 95 ¦ 33.40 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Thomas Larsen(C) ¦ 15 ¦ 29 ¦ 99 ¦ 34.60 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Tobias Schünemann(S) ¦ 15 ¦ 19 ¦ 72 ¦ 27.20 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Valentin Fritz(S) ¦ 12 ¦ 11 ¦ 96 ¦ 28.60 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Jakob Resetarits(V) ¦ 17 ¦ 15 ¦ 94 ¦ 32.00 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Nico Seger(V) ¦ 16 ¦ 13 ¦ 97 ¦ 31.60 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Kevin Boehm(G) ¦ 20 ¦ 18 ¦ 94 ¦ 34.40 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Blake Gale(RS) ¦ 15 ¦ 24 ¦ 54 ¦ 24.60 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Mario Linden(RS) ¦ 15 ¦ 30 ¦ 62 ¦ 27.40 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Christian Gauch(RS) ¦ 15 ¦ 21 ¦ 58 ¦ 24.80 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Nils Lippmann(RV) ¦ 15 ¦ 16 ¦ 70 ¦ 26.20 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Maximilian Leitner(RV) ¦ 12 ¦ 09 ¦ 100 ¦ 29.00 ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Simon Gentner(RV) ¦ 15 ¦ 41 ¦ 67 ¦ 30.60 ¦¦
    ¦¦============================¦========¦===========¦======¦==========¦¦
    ¦¦ Mittelwert ¦ 16.0 ¦ 19.0 ¦ 94.0 ¦ 32.84 ¦¦
    ¦¦============================¦========¦===========¦======¦==========¦¦

    Das wird in eine txt. Datei gespeichert und ich möchte dann danach die Werte wieder einlesen.
    Warums mir das jetzt mit STRG+C und STRG+V falsch formatiert ausgibt weis ich nicht.....

    Mein Problem ist, dass ich nicht verstehe wie ich mit fgets und sscanf über eine For-Schleife einlesen kann, so dass die richtigen Werte eingelesen werden und nicht irgendwas eingelesen wird.

    Wie gesagt, mit der Lösung von @Wutz klappt es.
    Nur möchte ich es irgendwie in eine For-Schleife verpacken (da mir das besser gefällt und ich eher nachvollziehen kann als mit dieser Vergleich-Variante)



  • @sour-fox
    Du liest ja auch die Trennzeilen " ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦" mit scanf ein.

    Da kommt halt Müll raus (Garbage in, Garbage out).

    Ist dir beim Code von Wutz am Ende der if-Zeile das ++i aufgefallen?

    @sour-fox sagte in fscanf gibt Muell aus:

    Warums mir das jetzt mit STRG+C und STRG+V falsch formatiert ausgibt weis ich nicht.....

    Weil das ein TrueType-Font ist. Für Code wird ein Fix-Font genommen.
    Wie du das per Hand formatierst, hat swordfish vor 5 Tagen geschrieben: Code markieren und auf </> klicken. (Aber da scheint Markdown mit dem Text ein Problem zu haben)

    ¦¦============================¦========¦===========¦======¦==========¦¦
    ¦¦ Spielername                ¦ Stärke ¦ Erfahrung ¦ Form ¦ SEF-Wert ¦¦
    ¦¦============================¦========¦===========¦======¦==========¦¦
    ¦¦ Robin Strandhagen(C)       ¦ 21     ¦ 21        ¦  95  ¦ 35.80    ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦
    ¦¦ Shawn Sarrazin(S)          ¦  16    ¦     25    ¦  96  ¦ 33.80    ¦¦
    ¦¦----------------------------¦--------¦-----------¦------¦----------¦¦ 
    

Log in to reply