sscanf macht probleme



  • Guten Morgen,

    irgendwie bin ich zu blöd einen sscanf Befehl richtig anzuwenden...

    Folgene Ausgangsposition:

    Ich habe einen Struct bestehen aus sieben Zahlen. Diesen Struct füge ich zu einem Buffer mit sprintf zusammen.

    char buffer[32];

    sprintf (buffer, "%05li;%04li;%03i;%03i;%03i;%03i;%04i", zahl1, zahl2, zahl3, usw.);

    (buffer sieht dann so aus: 01000;0000;009;056;003;011;0102)

    danach schreibe ich diesen mit fputs in eine Datei, klappt ohne Probleme, ist auch richtig formatiert und alles stimmt.

    fputs (buffer, fp);

    So, nun möcht ich diese Datei bei einem späteren Programmstart wieder einlesen
    das mache ich mit fgets:

    fgets (buffer, fp);

    danach möchte ich den Buffer wieder in seine Bestandteile zerlegen, dazu nehme ich sscanf, das ich so aufgebaut habe:

    sscanf (buffer, "%li;%li;%i;%i;%i;%i;%i", &t1, &t2, &t3, &t4, &t5, &t6, &t7);

    So und nun bin ich bei meinem Problem.
    Das Einlesen funktioniert ohne Probleme, wenn ich mir nach fgets den Buffer im Debugger anschaue, sieht er so aus wie oben schon genannt(01000;0000;009;056;003;011;0102). Aber nach dem sscanf Befehl stimmt dann garnichts mehr. Eigentlich sollte t1 der Wert 1000 haben und t2 null usw.
    In wirklichkeit hat t1 aber 512, t2 0, t3 0, t4 24770, t5 18, t6 -72 und t7 18.

    Ich kann mir aber nicht erklären warum das so ist.... vielleicht kann mir jemand von euch helfen. Besten Dank...



  • Hi,
    les die datei doch mit fscanf ein, dann musst du es nicht mehr hinterher zerlegen sonder liest es gleich richtig ein.

    MfG
    Basti



  • 01000 wird wegen der führenden 0 vermutlich als Oktalzahl gesehen, die korrekterweise dezimal 512 ist. Nimm %d bzw. %ld, wenn du Dezimalzahlen hast.

    Sind die Variablengrößen richtig? long int bzw. int?



  • die ersten beiden zahlen sind long werte und die restlichen short...



  • mit dem d hat es soweit funktioniert, das jetzt zwar die erste und die letzt zahl richtig eingelesen werden, aber zwischen drin ist alles null.



  • Wenn du short statt int verwendest, musst du das natürlich angeben: %hd statt %d.
    Sonst überschreibst du bei jeder Zuweisung die im Speicher davor liegende Variable.


Anmelden zum Antworten