打印控制台页面后,如何暂停我的 C 程序?
how can I pause my C program when a page of the console has been printed?
我正在开发一个基本的 SIC 汇编程序,我正在尝试实现的功能之一是在转储功能期间,如果程序在控制台上生成多于一页的文本,它会提示用户在继续之前按下一个键。
我的转储函数读取内存中地址范围的十六进制值。
首先你需要定义什么是"page"。然后你就会知道有多少行可用。然后在打印时停止输入每 X 行(其中 X 是每页的行数),然后再继续打印下 X 行。
因为读取输入会阻塞,直到用户按下 Enter 键(通常),然后您的程序似乎暂停了。
在 POSIX 系统上,最简单的方法是通过 more
传输其输出。或者在有它的系统上,less
.
FILE *outfd = popen("less", "w");
并使用它代替 stdout
。 popen(3)
由 POSIX 指定。 more
也是如此,但您可能想先尝试 less
。或者更好的是,在回退到 more
.
之前使用 getenv("PAGER")
让另一个程序弄清楚终端处理和所有这些,而不是尝试自己动手。
一些非POSIX 系统,例如Windows,也有您可以使用的传呼程序。我认为 Windows 甚至有一个 more
程序,但是如果它在 cygwin 之外的任何标准库中有一个 popen
函数,那么 IDK。
要将 stdout
重定向到管道,您可以使用更多低级 POSIX 函数,例如 dup2
(在 SO 上搜索示例)。
但我不认为仅用 popen
就可以轻松地做到这一点。在 GNU C 库 (glibc) 中,您可以分配给 stdout
,例如stdout = popen(...);
但其他 C 实现可能不支持:stdout
可以是不支持分配给的宏。 (See the glibc manual's Standard Streams page.)
我正在开发一个基本的 SIC 汇编程序,我正在尝试实现的功能之一是在转储功能期间,如果程序在控制台上生成多于一页的文本,它会提示用户在继续之前按下一个键。
我的转储函数读取内存中地址范围的十六进制值。
首先你需要定义什么是"page"。然后你就会知道有多少行可用。然后在打印时停止输入每 X 行(其中 X 是每页的行数),然后再继续打印下 X 行。
因为读取输入会阻塞,直到用户按下 Enter 键(通常),然后您的程序似乎暂停了。
在 POSIX 系统上,最简单的方法是通过 more
传输其输出。或者在有它的系统上,less
.
FILE *outfd = popen("less", "w");
并使用它代替 stdout
。 popen(3)
由 POSIX 指定。 more
也是如此,但您可能想先尝试 less
。或者更好的是,在回退到 more
.
getenv("PAGER")
让另一个程序弄清楚终端处理和所有这些,而不是尝试自己动手。
一些非POSIX 系统,例如Windows,也有您可以使用的传呼程序。我认为 Windows 甚至有一个 more
程序,但是如果它在 cygwin 之外的任何标准库中有一个 popen
函数,那么 IDK。
要将 stdout
重定向到管道,您可以使用更多低级 POSIX 函数,例如 dup2
(在 SO 上搜索示例)。
但我不认为仅用 popen
就可以轻松地做到这一点。在 GNU C 库 (glibc) 中,您可以分配给 stdout
,例如stdout = popen(...);
但其他 C 实现可能不支持:stdout
可以是不支持分配给的宏。 (See the glibc manual's Standard Streams page.)