Использование 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);