如何在 C++ 中用 cout 逐页打印?

How to print page by page with cout in C++?

假设我有这个代码:

for (int i=0; i<1000; i++) {
    cout << i << endl;
}

所以在控制台中,我们看到结果只打印一次,直到 999。我们再也看不到第一个数字(比如从 0 到 10 或 20),即使我们向上滚动。

如何逐页打印输出?我的意思是,例如,如果每页有 40 行,那么在控制台中我们会看到 0->39,当我们按 Enter 时,将显示接下来的 40 个数字 (40->79),依此类推,直到最后一个数字。

您可以使用 %(余数)运算符:

for (int i=0; i<1000; i++) {
    std::cout << i << '\n';
    if(i % 40 == 39) {
        std::cout << "Press return>";
        std::getchar();
    }
}

这将打印第 0-39 行,然后是第 40-79 行等

如果你需要一些东西来计算终端有多少行并适应它,你可以使用 cursesncursespdcurses。对于 windows,(我认为)pdcurses 是你应该去的。

#include <curses.h>

#include <iostream>

int main() {
    initscr();         // init curses
    int Lines = LINES; // fetch number of lines in the terminal
    endwin();          // end curses

    for(int i = 0; i < 1000; i++) {
        std::cout << i << '\n';
        if(i % Lines == Lines - 1) {
            std::cout << "Press return>";
            std::getchar();
        }
    }
}

这只会初始化 curses,获取终端中的行数,然后取消初始化 curses。如果你愿意,你可以留在 curses-mode 并使用 curses 函数来读取和写入终端。这将使您可以控制光标位置和屏幕上打印内容的属性,例如颜色和下划线等。

虽然前面的答案在技术上是正确的,但您只能在固定行数处中断输出,即至少仅使用标准 C++ 库,您无法知道在填充整个行之前可以打印多少行屏幕。您需要求助于特定的 OS API 才能知道这一点。

UNIX 用户可能会告诉您,实际上,您不应该在自己的程序中为此操心。如果你想分页,你应该将输出通过管道传输到命令,例如 lessmore,或者将它重定向到一个文件,然后使用文本编辑器查看该文件。