2016-01-14 32 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调用,它将打印文件中的前两个字符串,对我来说它是Hello2 World。这是为什么发生?即使我fflushfp在C中一起使用fscanf和fprintf

回答

6

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

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); 
+0

谢谢!我会在10分钟内接受你的回答。 –

+0

'rewind(fp)'可能更好,因为它也具有准备在读和写之间切换的效果(用于更新的文件)。 – Peter

+0

@彼得 - 谢谢,我更新了答案。 –