【问题标题】:Using fscanf and fprintf together in C在 C 中一起使用 fscanf 和 fprintf
【发布时间】:2016-04-19 19:56:40
【问题描述】:
#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 fopen file-handling


    【解决方案1】:

    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 调用被丢弃。

    在打开更新(读+写)的流上,调用 rewind 允许 在阅读和写作之间切换。

    最好也检查fscanf()的返回码。

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

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

    【讨论】:

    • rewind(fp) 可能更好,因为它还具有准备读取和写入之间切换的效果(对于为更新而打开的文件)。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多