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.
}
我正在尝试从我的 .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.
}