5

我看到控制台应用程序打印颜色,并看到诸如 ffmpeg 之类的应用程序在自身上打印文本而不是换行。如何在现有行上打印?我想在我的控制台应用程序的最顶部或最底部显示 fps,并让常规 printfs 去那里并正常滚动。

我需要这个用于 Windows,但这是跨平台的,所以我最终会有一个 linux 和 mac 实现。

4

7 回答 7

19

有两种简单的可能性适用于 linux 和 windows,但仅适用于一行:

  • printf("\b");将返回一个字符,因此您可以计算要退格的字符数并在循环中触发它,或者您知道您只写 n 个数字并这样做
    printf("\b\b\b\b\b\b\b\b\b\b");
  • printf("text to be overwritten by next printf\r");这会将光标返回到行首,因此任何下一个 printf 都会覆盖它。确保写入相同长度或更长的字符串,以便完全覆盖它。

如果你想重写几行,没有什么比ncurses更便携的了,几乎每个操作系统都有它的库,你不必照顾 ANSI 差异。

编辑:添加到 ncurses 维基百科页面的链接,提供了很好的概述和介绍,以及链接列表,可能还有您首选语言的翻译

于 2009-01-03T12:16:27.710 回答
3

查看 ncurses。它具有大多数脚本语言的绑定。

于 2009-01-03T12:15:45.120 回答
3

您可以使用'\r'而不是'\n'.

于 2009-01-03T12:30:28.087 回答
2

ASCII 字符编号 8(AKA Ctrl-H、BS 或 Backspace)可让您备份一个字符。ASCII 字符号 13(也称为 Ctrl-M、CR 或回车)将光标返回到行首。

如果您在 C 中工作,请putchar(8);尝试putchar(13);

于 2009-01-03T12:06:56.293 回答
2

颜色的魔力、光标定位和闪烁等都在ANSI 转义码中。任何能够处理 ANSI 代码的文本控制台都可以使用它们,只需将它们打印到控制台(即通过 bash 脚本中的 echo 或 C 中的 printf() 函数)。

Unix 终端支持 ANSI 转义序列,Windows 世界在旧的 MS-DOS 时代曾经支持它们,但多字节控制台支持结束了这一点。这里有更多信息。但是,除了在 Windows 上可用的 ANSI 序列打印之外,还有其他方法。此外,如果您在 Windows 上安装了 Cygwin,则处理 ANSI 代码的效果与在任何 Unix 终端上一样好。

许多人提到 Ncurses 库,它是任何基于 gui 的基于文本的应用程序的事实上的标准。这个库的作用是隐藏所有终端差异(Windows/Unix 风格)以在所有平台上表示尽可能相同的相同信息,尽管根据我自己的经验我告诉你这并不总是正确的(即典型的文本窗口框架更改,因为特殊字符并非在所有字符编码下都可用)。使用 ncurses 的对应物是它是一个完整的 API,与简单地为简单的事情(例如更改字体颜色、清洁屏幕或将光标移回随机位置)编写一些 ANSI 转义序列相比,开始使用它要困难得多位置。

For the sake of completeness I paste an example of use of ANSI sequence under Linux that changes the prompt to blue and shows the date:

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "
于 2009-01-03T12:50:07.673 回答
1

您可以使用Ncurses -

ncurses包是一个子程序库,用于独立于终端的屏幕绘制和输入事件处理,它向程序员提供高级屏幕模型,隐藏终端类型之间的差异并自动优化输出以将一个满屏文本更改为另一个

于 2009-01-03T12:17:13.947 回答
1

根据您正在开发的平台,您可能会使用更强大的 API,而不是旧的 ASCII 控制代码。

例如,如果您在 Win32 上工作,您实际上可以直接操作控制台屏幕缓冲区。

一个好的起点可能是这里 http://msdn.microsoft.com/en-us/library/ms683171(VS.85).aspx

我一直在寻找类似的功能/API,它允许我将控制台作为其他平台的文本流之外的东西来访问。还没有找到任何东西,但话说回来,我并没有那么努力地寻找。

希望能帮助到你。

于 2009-01-03T12:45:50.647 回答