【问题标题】:fgets doesnt read string from filefgets 不从文件中读取字符串
【发布时间】:2018-12-27 22:41:23
【问题描述】:

我是 C 语言的新手,我刚开始处理文件。 我有一个代码,它将一些值从数组写入文件,然后我想打印文件中的所有内容。然而,fgets 没有从 f 得到任何东西。字符串 s 为空。我究竟做错了什么? 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {

    FILE *f;
    if ((f=fopen("fis.txt","r+"))==NULL) { printf ("Error\n");
        exit(1);
    }

    float *v; int n;
    char s[1000];
    scanf("%d",&n);
    v=malloc(n*sizeof(float)); int x;
    for (int i=0;i<n;i++) {
        scanf("%f",&v[i]);
        x=fprintf(f,"%f\n",v[i]);

        if (x<0) perror("Error:");
    }

    fflush(stdin);
    fgets(s,sizeof(s),f); perror("err ");//NO ERROR
    printf("%d",strlen(s));//it's 0
    printf("%s",s);//nothing
    perror("err ");//NO ERROR
    printf("\n");

    free(v);
    fclose(f);
}

【问题讨论】:

  • 请在发布前正确格式化您的代码
  • 在你写完文件后,你可以关闭它,然后再次调用 fopen 重新打开它。第一次调用fopen 可以使用“w”作为模式来写入一个新文件,第二次可以使用“r”来读取它。
  • 我很抱歉我的代码格式。谢谢

标签: c arrays file printing


【解决方案1】:

您正在读取您之前写入的文件。 每次在读取和写入之间切换时,您需要刷新缓冲区或使用fseek 正确定位文件指针(例如,参见this SO answer)。请注意,您正在刷新stdin,这在这里没有意义(如果它有意义,我不确定)。

这样的电话

fseek(f,0,SEEK_SET)

在您的第一个 fgets 应该解决问题之前。

【讨论】:

  • 谢谢。现在我可以从文件中读取。但是,s 字符串不包含 f 中的所有值,仅包含第一个值。我不知道为什么它不能完全阅读。
  • @MaryPoppins 由于您在循环中执行 scanf/fprintf,因此您需要将后续的 fgets 放入循环中。
  • fgets 读取到第一个新行;您正在将每个浮点数写在新行中,这就是原因。你需要围绕你的fgets...
  • 在我之前的问题 (stackoverflow.com/questions/53944779/…) 中,有人告诉我“或者,您可以使用 fgets 阅读,它确实在字符串中包含换行符”。我使用了 fgets 并且能够使用 '\n' 读取整个文件。我很困惑..
  • 如果文件中只有一个新行,并且这个新行在文件的末尾,那么你就得到了整个文件。如果您有更多新行,fgets 将只读到下一行。清除吗?
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2022-11-17
  • 2019-05-23
相关资源
最近更新 更多