我想写一个打印出文件内容的方法。
我的方法如下:
void showFile(char* src) {
char output[100];
char a = 0;
FILE *file;
int i = 0;
file = fopen(src, "r");
do {
system("cls");
for (i = 0; i < min(24, filelength(src)-i); i++) {
fgets(output, 24, file);
printf("%s", output);
}
printf("\nNaechste Seite mit <Enter> ausgeben\n");
a = _getch();
} while (a == 13 && i < filelength(src)-1);
printf("\n\n");
fclose(file);
file = NULL;
}
它只需要将文件存储为文件路径。
min()方法如下所示,它返回较小的值:
int min(int x, int y) {
if (x > y) {
return y;
}
else {
return x;
}
}
现在我的问题是,当文件看起来像这样时:
This
Is
The
Files
Content
它会产生类似的结果:
This
Is
The
Files
Content
Content
Content
Content
Content
Content
Content
Content
Content
等等。我不知道问题到底在哪里。我希望其他人可以弄清楚我无法看到的失败?
提前致谢
答案 0 :(得分:1)
您需要注意fgets()
的返回状态,当没有更多数据(您已达到EOF)时,返回状态为NULL。即使你的循环会读取更多行,也没有任何东西可以阅读,它应该停止。
您反复获得相同的数据,因为fgets()
通常不会修改其字符串,如果它正在读取的输入流上有EOF。你可以将它用于内部循环,它应用了各种清理(一个由Serge Ballesta提供 - 删除filelength()
,它以字节而不是行来测量文件大小,因此值24和文件长度是不相称的,无论如何,由于效率原因,该函数不是你想要在循环的每次迭代中调用的函数。)
for (i = 0; i < 24; i++)
{
if (fgets(output, sizeof(output), file) == 0)
break;
printf("%s", output);
}
您可能还需要在外循环中检测EOF。只需一次,在那里使用feof(file)
甚至可能是合理的,看看外循环是do … while
循环的方式。
答案 1 :(得分:1)
您不需要事先知道文件的长度;您可以显示24行的批次,直到您用完要显示的文本为止。顺便说一下,您还假设所有线条都适合屏幕上的单行。即使情况并非如此,这是一种可行的替代方案:
#define SCREEN_WIDTH 79
void showFile(char* src)
{
char output[SCREEN_WIDTH+2];
FILE *file;
int i, a = 0;
file = fopen(src, "r");
if (!file) return;
do
{
system("cls");
for (i = 0; i < 24; i++)
{
if (!fgets(output, SCREEN_WIDTH, file))
break;
printf("%s", output);
if (output[strlen(output)-1] != '\n')
printf ("\n");
}
if (i == 24)
{
printf("\nNaechste Seite mit <Enter> ausgeben\n");
a = _getch();
} else
a = 0;
} while (a == 13);
printf("\n\n");
fclose(file);
}