#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
。为什么会这样?即使在我fflush
之后fp
?
答案 0 :(得分:7)
在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);