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