【发布时间】:2019-01-31 12:10:34
【问题描述】:
我对编码很陌生,所以请原谅我说的任何愚蠢的话。
我正在尝试使用 printf() 打印(在 c 中)相当长的文本,但由于它不能全部显示在屏幕上,它会跳转到文本的末尾,除非您向上滚动,否则开头是不可见的。有没有一种简单的方法可以让它打印长文本但留在开头并允许用户在阅读时向下滚动,然后再输入下一个命令?
【问题讨论】:
我对编码很陌生,所以请原谅我说的任何愚蠢的话。
我正在尝试使用 printf() 打印(在 c 中)相当长的文本,但由于它不能全部显示在屏幕上,它会跳转到文本的末尾,除非您向上滚动,否则开头是不可见的。有没有一种简单的方法可以让它打印长文本但留在开头并允许用户在阅读时向下滚动,然后再输入下一个命令?
【问题讨论】:
在 Unix(包括 Linux 和 Mac)上,内置了名为 more 和 less 的命令行程序,它们完全符合您的描述。 more 是一个程序,它只是等待用户在显示下一页输出之前按回车键或空格键。 less 略有改进,它允许 vi 编辑器击键(如 j 和 k)在输出中上下滚动。
more 也可以在 Windows 命令行中使用。您甚至可以找到less for Windows as well 的版本。
c:\users\selbie> your_program.exe | more
$> ./your_program | less
至于如何以编程方式执行此操作,这有点困难,因为它涉及测量控制台宽度和实现您自己的滚动缓冲区。可能有提供此功能的开源库,但控制台环境已经为产生长输出的应用提供了解决方案。
并非如此,尽管您可能会发现一个合理且简单的解决方案是只打印一定数量的行(例如 30 行),然后提示用户在显示更多行之前按 Enter。
您甚至可以找出终端的当前大小。那是特定于平台的;对于 Linux,这里有解释:How to get terminal window width?
【讨论】:
不是以标准方式,不。
您在 C 中的输出流只是一个字符流——滚动由您的终端处理。
根据您的终端,可能可以通过输出特殊字符来控制滚动,例如ANSI escape codes。 ncurses library 提供了一种操作终端的便携方式。
但是,如果您只是想要一种更方便的方式来查看您的输出(或实际上是任何命令输出),@selbie 的答案是最好的:使用more 或less。这将避免您的程序产生任何额外的复杂性。
【讨论】: