fscanf - Streik wieder abschalten



  • Aus einer Datei sollen mehrere float Werte herausgelesen werden, eine Zeile kann z.B. (in der Datei!) so aussehen:

    vn 5.0001 2.5000 -0.5000
    

    Auf ein 'vn' sollten normaler Weise immer drei float Zahlen folgen.
    Es erschien mir naheliegend, die Datei Zeile für Zeile einzulesen, und dann die fscanf() Funktion damit zu beauftragen, die drei float Werte einzulesen, ca. so:

    float normale[3];
    FILE* datei;
    /* usw. */
    fscanf(datei, "vn %f%f%f\n", normale, normale+1, normale+2);
    

    Wenn in der Datei aber einmal eine Zeile geringfügig von den Vorschriften abweicht (oder wenn fscanf z.B. nur zwei Zahlen findet und danach aufhört, weil in der Zeile ein Zeichen vorkommt, das nicht zu einem float gehören kann) dann scheint der komplette datei-Stream sofort defekt zu sein und auch alle anderen Lesefunktionen (fgets usw.) funktionieren dann nicht mehr, damit man dem Problem auf den Grund gehen könnte. Überhaupt hängt sich dann manchmal das Programm total auf und reagiert auf nichts mehr. WIE kann ich einem derartigen Fehler vorbeugen und WAS kann ich machen, um den datei-Stream nach so einer missglückten fscanf() Aktion zumindest wieder soweit zu reparieren, dass wenigstens die anderen Lesefunktionen dann wieder funktionieren ? Ich hätte mir schon überlegt, eventuell zuerst als die Zeile in einen char Buffer einzulesen und danach mit sscanf(Buffer) die Zahlen aus diesem Buffer herauszulesen, aber ich befürchte, dass sscanf wohl genauso herumspinnt, wenn es keine float Zahlen im Buffer entdeckt. Gibt's eine zuverlässige Alternative zu fscanf oder sscanf, wenn ich float Werte aus einer Datei lesen möchte?

    Besten Dank für Tipps.



  • Einfach2 schrieb:

    ...WIE kann ich einem derartigen Fehler vorbeugen ...

    Vorbeugen ist besser als heilen. 😃
    Sorge dafür, das deine Datei bei der Erzeugung das richtige Format bekommt.

    Einfach2 schrieb:

    und WAS kann ich machen, um den datei-Stream nach so einer missglückten fscanf() Aktion zumindest wieder soweit zu reparieren, dass wenigstens die anderen Lesefunktionen dann wieder funktionieren ?...

    Zunächst einmal würde ich dem Formatstring Leerzeichen spendieren:
    "vn %f %f %f \n". Das könnte schon einiges ausbügeln. Wennze 3 Zahlen erwartest, dann sollte fscanf auch eine 3 zurückgeben. Die scanf Konsorten geben die Anzahl der erfolgreich eingelesenen Objekte zurück.

    if ( 3 != fscanf(datei, "vn %f %f %f\n", normale, normale+1, normale+2))
    { 
    // Fehlerbehandlung.
    // Wenn fscanf fehlschlägt kannst du den Dateizeiger hinter das nächste 
    // '\n' positionieren und mit dem Einlesen weiter machen.
    

Anmelden zum Antworten