Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用termcaps保存多个光标位置,以便以后恢复它们?_C_Termcap - Fatal编程技术网

是否可以使用termcaps保存多个光标位置,以便以后恢复它们?

是否可以使用termcaps保存多个光标位置,以便以后恢复它们?,c,termcap,C,Termcap,我想知道是否有可能使用termcaps保存几个光标位置,以便以后能够恢复它们 例如: char *c_pos_1 = tgetstr("sc", NULL); //save cursor position at position 1 代码的后面部分 char *c_pos_2 = tgetstr("sc", NULL); char *c_pos_3 = tgetstr("sc", NULL); tputs(c_pos_2, 1, my_out); // restoring cursor a

我想知道是否有可能使用termcaps保存几个光标位置,以便以后能够恢复它们

例如:

char *c_pos_1 = tgetstr("sc", NULL); //save cursor position at position 1
代码的后面部分

char *c_pos_2 = tgetstr("sc", NULL);
char *c_pos_3 = tgetstr("sc", NULL);
tputs(c_pos_2, 1, my_out); // restoring cursor at c_pos_2
tputs(c_pos_1, 1, my_out); //restoring cursor at c_pos_1
代码的后面部分

char *c_pos_2 = tgetstr("sc", NULL);
char *c_pos_3 = tgetstr("sc", NULL);
tputs(c_pos_2, 1, my_out); // restoring cursor at c_pos_2
tputs(c_pos_1, 1, my_out); //restoring cursor at c_pos_1
代码的后面部分

char *c_pos_2 = tgetstr("sc", NULL);
char *c_pos_3 = tgetstr("sc", NULL);
tputs(c_pos_2, 1, my_out); // restoring cursor at c_pos_2
tputs(c_pos_1, 1, my_out); //restoring cursor at c_pos_1
后来在代码中

char *c_pos_2 = tgetstr("sc", NULL);
char *c_pos_3 = tgetstr("sc", NULL);
tputs(c_pos_2, 1, my_out); // restoring cursor at c_pos_2
tputs(c_pos_1, 1, my_out); //restoring cursor at c_pos_1
如果不可能,怎么做


感谢您的帮助:)

您似乎对至少两件事感到困惑:c_pos_1的内容,以及谁负责存储光标位置

char *c_pos_1 = tgetstr("sc", NULL);
您在
c_pos_1
中的内容无论如何都不是光标位置的表示。如果终端支持保存光标位置,则
c_pos_1
指向一个字符串,您可以将该字符串发送到终端,要求终端保存光标位置。换一种说法,你的代码

tputs(c_pos_1, 1, my_out); // restoring cursor at c_pos_2
实际上具有保存而不是恢复光标位置的效果

char *c_pos_1 = tgetstr("sc", NULL);
光标位置保存在终端中(实际上,它存储在运行终端仿真器的进程中,可能是
xterm
iterm
terminal.app
CMD.EXE
或其他),并且不保存在进程中

如果您的终端支持
sc
字符串,那么它也支持
rc
字符串,您可以发送该字符串以恢复先前保存的光标位置。同样,
rc
字符串不包含光标位置。它是一个字符串,用于命令终端(或终端仿真器)恢复终端先前保存的光标位置(当您向其发送
sc
字符串时)

要保存多个光标位置,您的终端必须支持多个不同的“保存光标”和“恢复光标”命令字符串,但termcap没有存储多个不同的“保存光标”和“恢复光标”命令字符串。或者,您的终端必须将保存的位置视为堆栈,在每次接收到
sc
命令时将光标位置推到堆栈上,并在每次接收到
rc
命令时将光标位置弹出。我怀疑任何现代的、通用的终端仿真器都不能做到这一点


“保存”和“恢复”光标位置的正常方法是,在程序中,通过仔细跟踪输出的所有内容的效果(对光标的影响),而不是依靠终端来保存和恢复光标位置,从而跟踪光标所在的位置。这就是像ncurses这样的库所做的。

您似乎对至少两件事感到困惑:c\u pos\u 1的内容,以及谁负责存储光标位置

char *c_pos_1 = tgetstr("sc", NULL);
您在
c_pos_1
中的内容无论如何都不是光标位置的表示。如果终端支持保存光标位置,则
c_pos_1
指向一个字符串,您可以将该字符串发送到终端,要求终端保存光标位置。换一种说法,你的代码

tputs(c_pos_1, 1, my_out); // restoring cursor at c_pos_2
实际上具有保存而不是恢复光标位置的效果

char *c_pos_1 = tgetstr("sc", NULL);
光标位置保存在终端中(实际上,它存储在运行终端仿真器的进程中,可能是
xterm
iterm
terminal.app
CMD.EXE
或其他),并且不保存在进程中

如果您的终端支持
sc
字符串,那么它也支持
rc
字符串,您可以发送该字符串以恢复先前保存的光标位置。同样,
rc
字符串不包含光标位置。它是一个字符串,用于命令终端(或终端仿真器)恢复终端先前保存的光标位置(当您向其发送
sc
字符串时)

要保存多个光标位置,您的终端必须支持多个不同的“保存光标”和“恢复光标”命令字符串,但termcap没有存储多个不同的“保存光标”和“恢复光标”命令字符串。或者,您的终端必须将保存的位置视为堆栈,在每次接收到
sc
命令时将光标位置推到堆栈上,并在每次接收到
rc
命令时将光标位置弹出。我怀疑任何现代的、通用的终端仿真器都不能做到这一点


“保存”和“恢复”光标位置的正常方法是,在程序中,通过仔细跟踪输出的所有内容的效果(对光标的影响),而不是依靠终端来保存和恢复光标位置,从而跟踪光标所在的位置。这就是像ncurses这样的图书馆所做的。

为什么不使用像ncurses这样更舒适的东西呢?这是一个学校项目,我们只能使用termcapsncurses使用termcapYes,但我只能使用函数tgoto、tgetstr、tgetnum、tgetflag和tputs。不幸的是,没有别的。为什么不使用像ncurses这样更舒适的东西呢?这是一个学校项目,我们只能使用termcapsncurses使用termcapYes,但我只能使用函数tgoto、tgetstr、tgetnum、tgetflag和tputs。非常感谢你的完整回答非常感谢你的完整回答