Differenza tra fgets e fscanf?

Ho una domanda riguardo fgets e fscanf in C. che Cosa è esattamente la differenza tra questi due? Per esempio:

char str[10];
while(fgets(str,10,ptr))
{
counter++;
...

e il secondo esempio:

char str[10];
while(fscanf(ptr,"%s",str))
{
counter++;
...

quando si ha un file di testo che contiene le stringhe che sono separati da uno spazio vuoto, per esempio: AB1234 AC5423 AS1433. Nel primo esempio il “contatore” nel ciclo while non darà lo stesso risultato, come nel secondo esempio. Quando si modifica il valore “10” in funzione fgets il contatore è sempre danno risultati diversi. Qual è il motivo per questo?
Qualcuno può per favore spiegare anche che cosa la fscanf esattamente, quanto è lunga la stringa in ogni ciclo while?

OriginaleL’autore phpheini | 2012-01-18

4 risposte

  1. 7

    La funzione fgets leggere fino a quando un “a capo” (e anche negozi). fscanf con il %s identificatore di legge fino a che uno spazio vuoto e non conservarlo…

    Come nota a margine, non stai specificando la dimensione del buffer in scanf ed è pericoloso. Provare:

    fscanf(ptr, "%9s", str)
    Grazie per la risposta, questo è anche simile per fputs e fprintf? O qual è la differenza tra di loro?
    No, quelli sono diversi. Per esempio %s non si ferma in spazi printf. Leggere il manuale.

    OriginaleL’autore cnicutar

  2. 3

    fgets legge un carattere di nuova riga. fscanf legge solo fino a spazi vuoti.

    OriginaleL’autore Carl Norum

  3. 2

    Nel tuo esempio, fgets di leggere fino a un massimo di 9 caratteri dallo stream di input e salvarli str, insieme con un 0 terminator. Non saltare i principali spazi vuoti. Si fermerà se si vede un “a capo” (che verrà salvato str) o EOF prima il numero massimo di caratteri.

    fscanf con il %s specificatore di conversione salta qualsiasi spazio all’inizio, poi leggere tutti i caratteri che non siano spazi, il salvataggio str seguito da uno 0 terminator. Si fermerà a leggere il prossimo carattere di spaziatura o EOF. In assenza di una esplicita larghezza del campo, si potrà leggere come molti spazi non sono in streaming, potenzialmente overruning il buffer di destinazione.

    Quindi, immaginare il flusso di input simile a questo: "\t abcdef\n<EOF>". Se è stato utilizzato fgets di leggerlo, str dovrebbe contenere "\t abcdef\n\0". Se è stato utilizzatofscanf, str potrebbe contenere "abcdef\0" (dove \0 indica l’0 terminator).

    OriginaleL’autore John Bode

  4. 1

    fgets leggere tutta la linea. fscanf con %s leggere una stringa, separati da uno spazio (o \n,\t,ecc…).
    Comunque, non si dovrebbe usare a meno che non si è sicuri che la matrice avete letto è grande abbastanza da contenere l’ingresso.
    Hai scritto When changing the "10" in the fgets function the counter will always give different results. Nota che fgets e scanf non so quanto byte da leggere. si dovrebbe dire loro. cambiare il “10” basta ingrandire il buffer di queste funzioni di scrivere.

    OriginaleL’autore asaelr

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *