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