fflush(stdin) mal wieder ;)



  • Das fflush(stdin) böse ist, ist ja bekannt. Die alternativ angebotenen "Ausleseschleifen" haben aber alle einen Nachteil: Man muss etwas eingeben, falls gar nichts mehr im Puffer steht!
    Ich habe letztens irgendwo so was aufgeschnappt:

    setvbuf(stdin, 0, _IONBF, 0);
    setvbuf(stdin, 0, _IOLBF, BUFSIZ);
    // Edit: oder
    rewind(stdin);
    // oder
    fseek(stdin, SEEK_END, 0);
    

    Ist das denn nicht standardkonform? Falls doch, warum steht es nicht in den FAQs?



  • setvbuf ist undefiniert, wenn der Stream erst einmal benutzt wurde:

    ISO/IEC 9899:1999 7.19.5.6 (2) schrieb:

    The setvbuf function may be used only after the stream pointed to by stream has been associated with an open file and before any other operation (other than an unsuccessful call to setvbuf) is performed on the stream.

    rewind ist (praktisch) ein Sonderfall von fseek, und beide sind nur für Ströme definiert, die Positionierungsanfragen bearbeiten können, wie Dateien auf der Festplatte. Stdin gehört nicht in diese Kategorie.

    Was Auleseschleifen angeht - ich nehme an, du meinst etwas wie

    { char c; while(fread(&c, 1, 1, datei) > 0 && c != '\n') ; }
    

    so ist das als "Ignoriere den Rest der Zeile" zu verstehen, nicht als "Lösche alles aus dem Eingabestrom" - letzteres ist, wenn man es sich recht überlegt, auch keine wohldefinierte Anforderung; was es bedeutet, hängt stark von Implementationsdetails ab, die man als Programmierer im Zweifel nicht mal kennt.

    Es ist dementsprechend sinnvoll, sie direkt nach formatierten Eingabeoperationen anzuwenden, wenn man zeilenbasierte Eingabe meint, und nicht etwa zu versuchen, vor einer nächsten Eingabeoperation zu erraten, welche Teile der Daten im Eingabestrom - wenn es denn welche gibt - man nicht mehr haben will.


Anmelden zum Antworten