2016-01-14 11 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; 
} 

Oto sprowadzona wersja tego, co próbuję zrobić. Ten kod nie drukuje niczego w konsoli. Jeśli usuniemy wywołanie fprintf, wypisze pierwsze 2 ciągi w pliku, dla mnie jego Hello2 World. Dlaczego to się dzieje? Nawet po fflushfp?Używanie fscanf i fprintf razem w C

Odpowiedz

6

Po fprintf() wskaźnik pliku wskazuje koniec pliku. Można użyć fseek() ustawić filepointer na początku pliku:

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

lub nawet lepiej jak sugeruje @Peter użyć rewind():

rewind(fp); 

rewind:

Wskaźniki wewnętrzne końca pliku i błędu powiązane ze strumieniem są usuwane po udanym wywołaniu tej funkcji, a wszystkie efekty z poprzednich połączeń do ungetc w tym strumieniu są usuwane.

Na strumieniach otwartych w celu aktualizacji (odczyt i zapis) wywołanie do przewinięcia umożliwia przełączanie między odczytywaniem i zapisywaniem.

Zawsze najlepiej sprawdzić kod powrotu na stronie fscanf().

Aby uniknąć przepełnienia bufora, można użyć:

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

Dzięki! Przyjmuję twoją odpowiedź za 10 minut. –

+0

'Przewiń do tyłu (fp)' jest prawdopodobnie lepsze, ponieważ ma również wpływ (w przypadku plików otwartych na aktualizację) przygotowania do przełączania między czytaniem a pisaniem. – Peter

+0

@Peter - Dzięki, zaktualizowałem odpowiedź. –

Powiązane problemy