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



  • Hi,
    wenn ich etwas mit scanf einlese und STRG-D bei Unix drücke, dann wird die Eingabe abgebrochen und EOF wird zurückgeliefert. Allerdings gibt scanf bei einem Fehlerfall ebenfalls EOF zurück. Woher weiss ich nun, ob das ein Fehler war oder nicht?

    Danke im Voraus!



  • Hm schrieb:

    Woher weiss ich nun, ob das ein Fehler war oder nicht?

    EOT vor EOL ist IMHO bei line buffered input ein Fehler.



  • "If any error occurs, EOF shall be returned"

    http://pubs.opengroup.org/onlinepubs/9699919799/



  • Moment: Ich glaub, ich hab dich falsch verstanden.
    Willst du darauf hinaus, dass ein Drücken von STRG-D bei der Eingabe ein Fehler ist?



  • Ja, das meine ich. Es darf natürlich gern' jemand kommen und mich eines Besseren belehren ... 🤡



  • OK, danke. Was meinst du eigentlich mit EOT und EOL?
    End of Text und End of Line?



  • EOT = End Of Transmission



  • 👍 EOT



  • Swordfish schrieb:

    Ja, das meine ich. Es darf natürlich gern' jemand kommen und mich eines Besseren belehren ... 🤡

    Was übrigens dagegen spricht, ist, dass errno nicht gesetzt wird!



  • Alles Schrott, was ihr hier erzählt.
    *scanf liefert nur EOF als Rückgabewert, wenn EOF im Lesestream vorkommt, BEVOR irgendein Format begonnen wurde, zu bearbeiten, sonst die Anzahl der erfolgreich bearbeiteten Formatspezifizierer. errno ist hier überhaupt kein Thema.
    EOF von stdin ist sowieso plattformabhängig, du müsstest sowieso entsprechend sonderbehandeln.
    Nimm eine getchar/fgetc Schleife, wenn EOF portabel ermitteln willst.



  • Swordfish schrieb:

    Ja, das meine ich. Es darf natürlich gern' jemand kommen und mich eines Besseren belehren ... 🤡

    In dem Fall: Danke!



  • Wutz schrieb:

    EOF von stdin ist sowieso plattformabhängig, du müsstest sowieso entsprechend sonderbehandeln.
    Nimm eine getchar/fgetc Schleife, wenn EOF portabel ermitteln willst.

    getchar() liest aber doch auch von stdin, das ja laut deiner Aussage plattformabhängig ist.



  • 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.


Log in to reply