Использование fscanf и fprintf вместе в C

#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 %sn ",FILE_NAME);
        exit(EXIT_FAILURE);         

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

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

1 ответов


после 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:

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

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

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

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

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