2016-01-14 27 views
6
#include <stdio.h> 
#include <stdlib.h> 

#define FILE_NAME "ff.txt" 

int main() {   
    char x[10],y[10]; 
    FILE *fp; 
    fp = fopen(FILE_NAME, "r+"); 
    if (fp == NULL) { 
     printf("couldn't find %s\n ",FILE_NAME); 
     exit(EXIT_FAILURE);   

    } 
    fprintf(fp,"Hello2 World\n"); 
    fflush(fp); 
    fscanf(fp,"%s %s",x,y); 
    printf("%s %s",x,y); 
    fclose(fp); 
    return 0; 
} 

Ecco una versione ridotta di ciò che sto cercando di fare. Questo codice non stampa nulla nella console. Se rimuovo la chiamata fprintf, stampa le prime 2 stringhe nel file, per me è Hello2 World. Perché sta succedendo? Anche dopo I fflush il fp?Utilizzo di fscanf e fprintf insieme in C

risposta

6

Dopo il fprintf(), il puntatore del file punta alla fine del file. È possibile utilizzare fseek() per impostare il filepointer all'inizio del file:

fprintf(fp,"Hello2 World\n"); 
fflush(fp); 
fseek(fp, 0, SEEK_SET); 
fscanf(fp,"%s %s",x,y); 

O ancora meglio come suggerito da @Peter, utilizzare rewind():

rewind(fp); 

rewind:

Il gli indicatori interni di fine file e di errore associati allo stream vengono cancellati dopo una chiamata riuscita a questa funzione e tutti gli effetti da precedenti chiamate a ungetc su questo flusso vengono eliminate.

Sui flussi aperti per l'aggiornamento (lettura + scrittura), una chiamata al riavvolgimento consente di passare da tra lettura e scrittura.

È sempre consigliabile controllare anche il codice di ritorno fscanf().

Per evitare buffer overflow, è possibile utilizzare:

fscanf(fp,"%9s %9s",x,y); 
+0

Grazie! Accetterò la tua risposta in 10 minuti. –

+0

'rewind (fp)' è probabilmente migliore, poiché ha anche l'effetto (per i file aperti per l'aggiornamento) di preparare un passaggio tra lettura e scrittura. – Peter

+0

@Peter - Grazie, ho aggiornato la risposta. –