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

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

提问人:trangan 提问时间:10/25/2021 最后编辑:trangan 更新时间:10/25/2021 访问量:573

问:

想象一下,我有这样的代码:

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

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

enter image description here

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

C++ 控制台 控制台-应用程序 IOSTREAM COUT

评论

1赞 sweenish 10/25/2021
最好将输出通过管道传输到 *nix 系统上。我不知道 Windows 等效是什么。至于无法看到前几项,那是终端设置,与您的代码无关。less

答:

0赞 Ted Lyngmo 10/25/2021 #1

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

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 行,依此类推。

如果您需要一些东西来计算终端有多少行并适应它,您可以使用 或 。对于 Windows,(我认为)是您应该追求的。cursesncursespdcursespdcurses

#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();
        }
    }
}

这只会初始化 ,获取终端中的行数,然后 deinit 。如果需要,您可以保持诅咒模式,并使用函数来读取和写入终端。这将使您可以控制在屏幕上打印的内容的光标位置和属性,例如颜色和下划线等。cursescursescurses

评论

0赞 trangan 10/25/2021
感谢您的解决方案。但我正在寻找一种适用于不同操作系统、不同分辨率的解决方案。所以我们不能像这样放一个固定的数字。但正如其他人所说,正如我搜索的那样,我们似乎没有使用 C++ 代码解决这个问题......
0赞 Ted Lyngmo 10/25/2021
@trangan “我正在寻找一种适用于不同操作系统、不同分辨率的解决方案。” - 好吧,这并不明显:-)好吧,您可以使用一个库来创建非常便携的东西。pdcurses
1赞 Ted Lyngmo 10/25/2021
@trangan我为此添加了一个可能的解决方案。curses
1赞 trangan 10/30/2021
非常感谢,它奏效了!:)有好的一天!
0赞 Ted Lyngmo 10/30/2021
@trangan不错!很高兴它有所帮助,不客气!
1赞 QuentinC 10/25/2021 #2

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

UNIX 的人可能会告诉你,事实上,你不应该在自己的程序中为此烦恼。如果要分页,只需将输出通过管道传递给 或 等命令,或将其重定向到文件,然后使用文本编辑器查看文件。lessmore

评论

0赞 Алексей Неудачин 10/25/2021
|more在 Windows 上运行,并且在 UNIX 之前在 MSDOS 上运行。从 80 年代初开始.