fgets 只读取文件的第一行

fgets only read the first line of file

我正在尝试从我的 .cpp 文件中读取一个文件。我正在使用 C 库,所以请不要混淆它。

所以问题和我标题说的一样清楚了。 fgets 方法可以读取第一行,但是当涉及到第二行时,它既不能读取第二行也不能读取文件的其余部分(因为它会在出现问题时退出)。

您可以找到相关部分代码:

void read_input()
{
      int i = 0, N = 5;
  char str[STR_SIZE], line[STR_SIZE];
  FILE *fp;

  fp = fopen("out", "r");
  if (!fp)
    {
      fprintf(stderr, "error: file could not be opened\n");
      exit(1);
    }

  for (i = 0; i<2; i++)
    {
      if (fgets(str, STR_SIZE, fp) == NULL)
        {
          fprintf(stderr, "error: failed at file reading\n");
          exit(1);
        }

      if (feof(fp))
        {
          fprintf(stderr, "error: not enough lines in file\n");
          exit(1);
        }

      if ((sscanf(str, "%s", line) != 1) )
        {
          fprintf(stderr, "error: invalid file format\n");
          exit(1);
        }
      printf("%d\t%s\n", i, line);
      fclose(fp);
    }
}

我相信,问题就在那里,因为你在循环中使用了 fclose(fp);。因此,在第一次迭代之后,fp 被传递给 fclose() 并且在任何进一步的迭代中重复使用 fp 将调用 undefined behavior 作为 fp 不再 有效

解决方案:将 fclose(fp); 移到循环外。

您正在循环关闭文件!将 fclose 函数放在循环之外。

for (i = 0; i<2; i++)
{
    ....
    printf("%d\t%s\n", i, line);
    fclose(fp); // <-- here, move out of the loop.
}