1

在我的 C 程序中,我想知道我的光标在终端中的位置。例如,另一个程序可能在我之前写了一些东西,我想知道在终端的最后一列之前还剩下多少空间,或者我不知道终端对某些特殊序列的反应(比如颜色:我可以写但它们没有显示)。

有什么建议吗?

编辑:最好避免像ncurses这样的复杂解决方案(ncurses不直接知道光标在哪里:它计算它的位置)。

编辑2:我找到了一种方法,但它只适用于非图形终端:https ://www.linuxquestions.org/questions/programming-9/get-cursor-position-in-c-947833/

编辑 3:不错的代码,它运行良好,但它使用 /dev/vcsaN(与编辑 2相同的问题):http ://dell9.ma.utexas.edu/cgi-bin/man-cgi?vcs+4

4

4 回答 4

2

Ncurses 是一个强大的库,用于创建基于终端的文本界面。

tputs是用于操作终端功能的简单低级通用函数。

任何一个都可以满足您的需求。

于 2013-03-16T18:21:26.453 回答
1

您可以尝试使用 ncurses' getyx()

于 2013-03-16T17:28:17.600 回答
0

此解决方案不是最佳解决方案,因为它引用 /dev/vcsa*。希望这可以帮助别人。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
    int fd;
    char *device = "/dev/vcsa2";
    struct {unsigned char lines, cols, x, y;} scrn;
    fd = open(device, O_RDWR);
    if (fd < 0) {
        perror(device);
        exit(EXIT_FAILURE);
    }
    (void) read(fd, &scrn, 4);
    printf("%d %d\n", scrn.x, scrn.y);
    exit(EXIT_SUCCESS);
}
于 2013-03-17T12:42:31.930 回答
0

一般来说,你应该记住你离开光标的位置。

但是,大多数终端都会响应DSR; 设备状态请求。通过发送

CSI 6 n

你会收到一个CPR;光标位置报告,形式为

CSI Pl;Pc R

wherePlPc给出光标行号和列号,从 1 开始索引。

于 2013-03-30T14:15:25.493 回答