在C中一起使用fscanf和fprintf

Ane*_*gra 6 c fopen file-handling

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是我想要做的简化版本.此代码不会在控制台中打印任何内容.如果我删除了fprintf调用,它会打印文件中的前两个字符串,对我而言Hello2 World.为什么会这样?即使在我fflush的fp?

Dan*_*_ds 7

之后fprintf(),文件指针指向文件的末尾.您可以使用fseek()在文件开头设置filepointer:

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

或者甚至更好的@Peter建议,使用rewind():

rewind(fp);
Run Code Online (Sandbox Code Playgroud)

rewind:

成功调用此函数后,将清除与该流关联的文件结束和错误内部指示符,并删除此流上先前调用ungetc的所有效果.

在打开以进行更新(读取+写入)的流上,对重绕的调用允许在读取和写入之间切换.

最好还是检查返回码fscanf().

为避免缓冲区溢出,您可以使用:

fscanf(fp,"%9s %9s",x,y);
Run Code Online (Sandbox Code Playgroud)