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

Вот своя версия того, что я пытаюсь сделать. Этот код ничего не печатает в консоли. Если я удалю вызов fprintf, он печатает первые 2 строки в файле, для меня его Hello2 World. Почему это происходит? Даже после того, как я fflushfp?Использование fscanf и fprintf вместе в C

ответ

6

После fprintf() указатель файла указывает на конец файла. Вы можете использовать fseek() установить filepointer в начале файла:

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

Или еще лучше, как предложил @Peter использовать rewind():

rewind(fp); 

rewind:

конец файла и внутренние индикаторы ошибок, связанные с потоком , удаляются после успешного вызова этой функции и всех эффектов из предыдущих вызовов для отмены этого потока.

В потоках, открытых для обновления (чтение + запись), вызов перемотки позволяет переключаться между чтением и записью.

Всегда лучше проверить код возврата fscanf().

Чтобы избежать переполнения буфера, вы можете использовать:

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

Спасибо! Я отвечу на ваш ответ через 10 минут. –

+0

'rewind (fp)', вероятно, лучше, так как он также имеет эффект (для файлов, открытых для обновления) подготовки к переключению между чтением и записью. – Peter

+0

@Peter - Спасибо, я обновил ответ. –