Approfondimento sulla fflush(stdin)

di il
3 risposte

Approfondimento sulla fflush(stdin)

Sto cercando di capire quando necessario usare fflush(stdin) in relazione alla scanf.

Se ho ben compreso nella lettura da stdin utilizzando 

char buffer[1024];
scanf("%s", buffer); 

vengono accumulati nel buffer eventuali caratteri “spuri” che non hanno fatto match con il %s (p.e. se ci sono enne parole separate da spazi, dalla 2a parola fino al \n vengono memorizzate nel buffer)  andando a  “sporcare il buffer”, per cui con la fflush andiamo a ripulire questa area di memoria che sarà "libera" per le prossime scanf.

Corretto?

3 Risposte

  • Re: Approfondimento sulla fflush(stdin)

    Non lo devi usare mai.

    fflush(stdin) è undefined behavior secondo lo standard

    
    7.21.5.2 The fflush function
    Synopsis
    
    1
    
             #include <stdio.h>
             int fflush(FILE *stream);
             
    Description
    
    2 If stream points to an output stream 
    or an update stream in which the most 
    recent operation was not input, the fflush 
    function causes any unwritten data for that 
    stream to be delivered to the host environment 
    to be written to the file; otherwise, 
    the behavior is undefined.
    
    3 If stream is a null pointer, 
    the fflush function performs this flushing 
    action on all streams for which the behavior
    is defined above.
    
    Returns
    
    4 The fflush function sets the error indicator 
    for the stream and returns EOF if a write error 
    occurs, otherwise it returns zero.
    
    
  • Re: Approfondimento sulla fflush(stdin)

    13/06/2023 - Weierstrass ha scritto:


    Non lo devi usare mai.

    fflush(stdin) è undefined behavior secondo lo standard

    Ok, non la utilizzerò se le cose stanno in questi termini.

    Mi interessa però se a livello concettuale è corretto ciò che ho detto, supponendo per assurdo che non avesse un comportamento indefinito ma che facesse il suo mestieri di ripulita stream.

  • Re: Approfondimento sulla fflush(stdin)

    Quale mestiere deve fare? Non lo controlli tu lo stream in ingresso: per questo non hanno messo nulla nello standard, perché non ha senso.

    Se vuoi, puoi vedere cosa fa una determinata versione di un determinato sistema operativo

    Ad esempio linux fa questo

           For output streams, fflush() forces a write of all user-space
           buffered data for the given output or update stream via the
           stream's underlying write function.
    
           For input streams associated with seekable files (e.g., disk
           files, but not pipes or terminals), fflush() discards any
           buffered data that has been fetched from the underlying file, but
           has not been consumed by the application.
    
           The open status of the stream is unaffected.
    
           If the stream argument is NULL, fflush() flushes all open output
           streams.

    Come vedi anche qui il terminale in ingresso viene escluso

    Se proprio vuoi approfondire, puoi informarti su come si interagisce con un terminale in maniera non bloccante e gestendo un input qualsiasi

Devi accedere o registrarti per scrivere nel forum
3 risposte