【问题标题】:C - Setting Printf Coordinates without external librariesC - 在没有外部库的情况下设置 Printf 坐标
【发布时间】:2018-05-10 16:47:15
【问题描述】:

我希望能够使用 x 和 y 坐标,使用 SetCursorPosition 函数进行打印,但据我所知,正确的方法是使用 ncurses。是否可以使用默认的 c 库(如 stdio 或 stdlib)来做到这一点?

【问题讨论】:

  • 您可以随时使用old school way 控制代码。
  • 如果您在 DOS/Windows 中,则可以使用 Win32 API SetCursorPosSetConsoleCursorPosition。如果您使用的是 Linux,或者想要在 Windows、Mac 和 *nix 上进行便携式文本模式光标控制......那么ncurses 绝对是您的最佳选择。
  • 标准 C 无法识别您想要这样做。因此,任何解决方案都将是特定于平台的。如果担心可移植性,请使用可移植库的功能。

标签: c


【解决方案1】:

C 标准库 I/O 函数是围绕使用发送或接收的字节流而设计的。这些字节流被发送到某些设备,例如终端或打印机或文件或网络设备。标准库 I/O 真正面向文本终端、文本打印机和文件,其中字节或文本字符流写入设备句柄或从设备句柄读取。

关于标准库的唯一一种设备特定定位是用于使用诸如ftell()fseek() 以及rewind()fgetpos()fsetpos() 等函数的文件(参见what is difference between fgetpos/fsetpos and ftell/fseek 的解释至于区别)。

C 标准库 I/O 函数没有任何终端或打印机设备特定的功能,例如定位光标、设置文本颜色或文本字体、定位窗口、更改窗口或图形用户共有的任何其他功能接口或图形打印机(激光或喷墨)。

一种常见的解决方法是使用特殊字符escape codes 来指示后面的文本是对设备本身的命令,然后指定一个命令,例如设置光标位置或设置文本颜色。这些命令序列有许多实际标准,具体取决于目标设备。

在过去有 80 列、25 行终端的时代,大多数终端都支持事实上的标准,其中一些光标定位元素模仿了 VT-100 video terminal from Digital Equipment Corporation 提供的内容。

为了访问该光标定位功能,开发了第一个 C 兼容库,以便程序员可以指定光标位置,并且库函数将为该位置创建正确的转义码序列并将其发送到终端。

ncurses 是这些早期库的现代版本,在不需要完整的 GUI 时可能最常用于文本终端仿真。

您可能会发现此List of platform-independent GUI libraries 很有帮助,尽管 GUI 库可能超出您的实际需要。

另请参阅Cross Platform C library for GUI Apps? 的各种答案

【讨论】:

    【解决方案2】:

    你可以这样做

    printf("\033[%d;%dH", row, column);
    printf("text I want to print");
    fflush(stdout);
    

    如果你会做很多,你可以把它封装成一个函数:

    void mySetCursorPosition(int row, int column)
    {
        printf("\033[%d;%dH", row, column);
    }
    

    这是完全不可移植的,它盲目地假设您的终端(或终端仿真窗口)使用传统的 ANSI 转义序列——现在他们都这样做了,所以这很可能适合您。

    当您想要做一些更高级别或更便携的事情时,您可以了解这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多