C - 从文件打印文本,使用回车滚动

时间:2014-12-11 15:07:26

标签: c file

我想写一个打印出文件内容的方法。

我的方法如下:

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

等等。我不知道问题到底在哪里。我希望其他人可以弄清楚我无法看到的失败?

提前致谢

2 个答案:

答案 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); 
}