C 获取哪个端子列I';我在写

C 获取哪个端子列I';我在写,c,terminal,C,Terminal,在我的C程序中,我想知道光标在终端中的位置。例如,另一个程序可能在我之前写了一些东西,我想知道在终端的最后一列之前还有多少空间,或者我不知道终端对一些特殊序列的反应(比如颜色:我可以写,但它们没有显示) 有什么建议吗 编辑:最好避免像ncurses这样过于复杂的解决方案(ncurses不直接知道光标在哪里:它计算光标的位置) 编辑2:我找到了一种方法,但它只适用于非图形终端: 编辑3:代码不错,运行良好,但它使用了/dev/vcsaN(与编辑2的问题相同):您可以尝试使用ncurses”。ncu

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

有什么建议吗

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

编辑2:我找到了一种方法,但它只适用于非图形终端:


编辑3:代码不错,运行良好,但它使用了/dev/vcsaN(与编辑2的问题相同):

您可以尝试使用ncurses”。

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

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


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

此解决方案不是最佳解决方案,因为它引用了/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);
}
#包括
#包括
#包括
内部主(空)
{
int-fd;
char*device=“/dev/vcsa2”;
结构{无符号字符行,cols,x,y;}scrn;
fd=开路(装置,O_RDWR);
如果(fd<0){
perror(装置);
退出(退出失败);
}
(无效)读取(fd和scrn,4);
printf(“%d%d\n”,scrn.x,scrn.y);
退出(退出成功);
}

通常,您应该记住光标的位置

然而,大多数终端确实响应DSR;设备状态请求。发送

CSI 6 n
您将收到
CPR
;光标位置报告,格式为

CSI Pl;Pc R

其中,
Pl
Pc
给出光标行和列号,从1开始索引。

int get\u column(){printf(“\n\r”);return 0;}
bash不是终端。@H2CO3我需要在它所在的位置,不以新的方式移动光标line@n.m.根据Shell修复没有列或光标。
tput
很好,但我不知道如何使用它来获取当前位置。我的记忆失败了,是tput,不是tput,它比我想象的要复杂一些,而且它是ncurses的一部分。因此,使用它不会带来任何好处。坚持使用getyx可能是明智的。顺便说一下,使用tput是可能的<代码>stty-回波;tput u7;read-drpos;stty回波;echo${pos#??}如果我使用
echo-ne“\e[6n”
同样可以工作,现在我必须了解如何在C程序中获取这些数据。tput是一个可执行命令,tputs是库中的函数。终端功能是数据库,
u7
是键,
tigetstr
是查找运算符,
\e[6n
是值。数据库通常位于
/usr/share/terminfo
,但请参阅
人诅咒
的环境部分。数据库格式在
人terminfo
中描述,很容易解析。它似乎只能在ncurses程序中使用,而我需要查看比赛。也许我错了(我不使用ncurses)。@FrancescofRasinelli:对于终端处理,
curses
是最简单的选择。
printf()
是向终端发送内容的传统方式。但是,您通常会读取终端输入。有很多方法。完全手动使用
termios
+
read
,或某种包装库。例如,我的
libtermkey
,我主要是为类似的内容编写的。我可以使用read使用bash来完成这项工作(正如你在另一条评论中看到的),但不是在虚拟终端的C语言中。你能提供一个例子吗?