EOF und scanf: Woher weiss ich, ob das ein Fehler war?



  • Bei Verwendung von scanf müsstest du EOF plattformabhängig aus dem gelesenen String rausfrickeln (z.B. 26 für ^Z), du kannst nicht einfach im String direkt nach EOF ( i.A. == -1 ) suchen. Das war damit gemeint, während du bei getchar direkt nach ==EOF abfragen könntest.



  • Ich hatte gar nicht vor irgendetwas im String zu suchen:

    if (scanf("%d", &n) == EOF) { ...}
    


  • Kannst du lesen?
    Scheinbar nicht, denn sonst hättest du meine vorherige Antwort gelesen und du hättest erkannt, dass du dich mit deinem letztgenannten Versuch als Noob entlarft hast.



  • Hey, ich bin ein Noob. Was ist daran so schlimm? 🤡

    If the input ends before the first matching failure or conversion, EOF shall be returned.

    Ist doch egal, ob ich bei Unix STRG-D drücke oder bei Windows STRG-SHIFT-Z - beides sollte EOF zurückgeben, weil die Eingabe vorzeitig vor der Verarbeitung abgebrochen wurde.



  • @Wutz: Es gibt einen Unterschied zwischen nicht lesen können, und das gelesene nicht verstehen. 💡 Ich war vor Deinem Kommentar auch auf dem Holzweg - würdest mich auch so anpflaumen?

    @Hm: Was Wutz Dir sagen wollte ist, dass Du zuerst mit getchar( ) einen Puffer füllen sollst. Dabei hast Du dann auch die Möglichkeit, sachen wie EOF oder sonstwas abzufangen, ggf. in etwas Dir entgegenkommenderes zu übersetzen. Dem Puffer kannst Du dann mit sscanf( ) das fürchten lehren. 👍 😉



  • Swordfish schrieb:

    @Hm: Was Wutz Dir sagen wollte ist, dass Du zuerst mit getchar( ) einen Puffer füllen sollst. Dabei hast Du dann auch die Möglichkeit, sachen wie EOF oder sonstwas abzufangen, ggf. in etwas Dir entgegenkommenderes zu übersetzen. Dem Puffer kannst Du dann mit sscanf( ) das fürchten lehren. 👍 😉

    Danke. Ohne trollen zu wollen: Das ist sicherlich ein gutes Bandbreit-Antibiotokum wie man ganz allgemein vorgehen sollte, aber das beantwortet mir immernoch nicht folgende Fragen:

    - Bei einem gewollten Abbruch des Benutzers, kann ich das doch mit scanf genauso systemunabhängig abfangen wie mit getchar(). Beide geben doch EOF zurück, oder habe ich den Posix-Standard, den ich zitiert hatte, falsch verstanden?

    - Wenn beim Einlesen ein Fehler auftritt, wird zwar errno gesetzt, aber es ist nicht sichergestellt, ob der Wert nicht von einem alten Fehler stammt. Wie kann ich nun einen gewollten Abbruch von einem Fehler unterscheiden?

    Ich konnte die Antworten diesbezüglich irgendwie noch nicht aus den Postings rauslesen.
    Du sagtest, dass ein vorzeitiger Abbruch ein Fehler sei, was sich aber als falsch herausgestellt hat.



  • Hm schrieb:

    - Wenn beim Einlesen ein Fehler auftritt, wird zwar errno gesetzt, aber es ist nicht sichergestellt, ob der Wert nicht von einem alten Fehler stammt. Wie kann ich nun einen gewollten Abbruch von einem Fehler unterscheiden?

    Achso, um mich klarer auszudrücken: Sowohl getchar() als auch scanf geben im Fehlerfall ebenfalls EOF zurück. Wie deute ich das nun?


  • Mod

    Hm schrieb:

    Achso, um mich klarer auszudrücken: Sowohl getchar() als auch scanf geben im Fehlerfall ebenfalls EOF zurück. Wie deute ich das nun?

    In beiden Fällen hast du keine Chance, weiter zu machen.



  • Hi Sepp,
    danke, für deine Antwort.
    Verstehe ich dich dann richtig, dass man tatsächlich einen Benutzerabbruch nicht von einem Fehler unterscheiden kann, da ja beides EOF zurück gibt?!


  • Mod

    Soweit ich weiß: Ja. Der Datenstrom ist schlichtweg zu Ende.



  • Wenn ich vorher errno cleare. Dann müsste es doch passen, oder?
    Benutzerabbruch --> errno wird nicht gesetzt (errno == 0).
    Fehler --> errno wird gesetzt (errno != 0).


Anmelden zum Antworten