Problem beim auslesen von textdatei (fscanf)



  • Hallo,

    ich versuche eine Textdatei auszulesen, aber leider wird ab zeile 12 das falsch eingelesen.

    fscanf(fFile, "%i:%i.%i %*i %s %*[^\n]s", &Minutes, &Seconds, &MiliSeconds, &Artefact);
    
    0:00.036       13     +    0    0    0
        0:00.188       68     R    0    0    0
        0:01.025      369     R    0    0    0
        0:01.872      674     R    0    0    0
        0:02.722      980     R    0    0    0
        0:03.566     1284     R    0    0    0
        0:04.408     1587     R    0    0    0
        0:05.219     1879     R    0    0    0
        0:06.041     2175     R    0    0    0
        0:06.875     2475     R    0    0    0
        0:07.683     2766     R    0    0    0
        0:08.483     3054     R    0    0    0
        ...
    

    Bis zeile 11 funktioniert alles einwandfrei.
    (Minutes = 0, Seconds = 7, MiliSeconds = 683, Artefact = R)
    Bei zeile 12 jedoch klappt nix mehr.
    (Minutes = 0, Seconds = 0, MiliSeconds = 683, Artefact = R)
    Nun ich hab rausgefunden das es wohl daran liegt das die Curserposition ab Zeile 11 falsch gesetzt wird. Die Position erhöt sich bloß um 8, sonst um 43.
    Bloß ich hab keine Ahnung woran das liegen könnte, habt ihr vllt. Ideen?

    MfG gosha16



  • Guten morgen gosha16,

    dein Fehler liegt in deiner fscanf-Zeile:

    036 wird durch %i interpretiert als oktal-Zahl und hat im Dezimalsystem den Wert 30.
    

    Im Oktal-Zahlensystem dürfen nur die Ziffern 0-7 verwendet werden.
    In der 12. Zeile steht aber für Sekunden die Zahl 08 was kein gültiger
    Input ist. Daher wird diese Zahl nicht erkannt und es kommt zu Fehlern
    beim Einlesen.

    Ausgabe mit deiner fscanf-Zeile:

    0  min:  0   sec:  0   mil:  30   art: -+-  rc: 4
     1  min:  0   sec:  0   mil: 188   art: -R-  rc: 4
     2  min:  0   sec:  1   mil:  21   art: -R-  rc: 4
     3  min:  0   sec:  1   mil: 872   art: -R-  rc: 4
     4  min:  0   sec:  2   mil: 722   art: -R-  rc: 4
     5  min:  0   sec:  3   mil: 566   art: -R-  rc: 4
     6  min:  0   sec:  4   mil: 408   art: -R-  rc: 4
     7  min:  0   sec:  5   mil: 219   art: -R-  rc: 4
     8  min:  0   sec:  6   mil:  33   art: -R-  rc: 4
     9  min:  0   sec:  6   mil: 875   art: -R-  rc: 4
    10  min:  0   sec:  7   mil: 683   art: -R-  rc: 4
    11  min:  0   sec:  0   mil: 683   art: -R-  rc: 2
    12  min:  8   sec:  0   mil: 683   art: -R-  rc: 1
    13  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    14  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    15  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    16  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    17  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    18  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    19  min:  8   sec:  0   mil: 683   art: -R-  rc: 0
    

    Es fällt auf, dass die Millisekunden nicht den Werten in deinem Beispiel
    entsprechen. Der rc-Wert gibt an, wieviele Zuweisungen fscanf() richtig
    machen konnte. Es fällt auf, dass er in den ersten 11 Zeilen alle vier
    Zuweisungen geschafft hat, danach nicht mehr alle.

    Wenn du aber die Zeile nach:

    rc = fscanf(fp, "%d:%d.%d %*d %s %*[^\n]s", &min, &sec, &mil, &a);
    

    änderst, erhälst du folgende Eingabe:

    0  min:  0   sec:  0   mil:  36   art: -+-  rc: 4
     1  min:  0   sec:  0   mil: 188   art: -R-  rc: 4
     2  min:  0   sec:  1   mil:  25   art: -R-  rc: 4
     3  min:  0   sec:  1   mil: 872   art: -R-  rc: 4
     4  min:  0   sec:  2   mil: 722   art: -R-  rc: 4
     5  min:  0   sec:  3   mil: 566   art: -R-  rc: 4
     6  min:  0   sec:  4   mil: 408   art: -R-  rc: 4
     7  min:  0   sec:  5   mil: 219   art: -R-  rc: 4
     8  min:  0   sec:  6   mil:  41   art: -R-  rc: 4
     9  min:  0   sec:  6   mil: 875   art: -R-  rc: 4
    10  min:  0   sec:  7   mil: 683   art: -R-  rc: 4
    11  min:  0   sec:  8   mil: 483   art: -R-  rc: 4
    

    Gruß mcr



  • %i interpretiert die Eingabe nach C-Syntax, d.h. insbesondere, dass Zahlen, die mit 0 beginnen, als Oktal interpretiert werden. Bis 07 geht das bei dir gut, bei 08 gibt es einen Fehler. Ersetze mal alle %i durch %d.

    Edit: Argh.



  • Ui, man lernt halt nie aus... 😃
    Danke euch beiden! 🙂



  • Hallo,

    das "s" ist übrigens nicht richtig, wenn Formate in der [..]-Form angegeben werden, tut in diesem Falle aber nichts Böses, aber sonst sollte man daran denken.

    MfG,

    Probe-Nutzer


Anmelden zum Antworten