关于退格(\b)和回车(\r)的一些问题
本帖最后由 liuzhengyuan 于 2020-6-20 14:21 编辑我知道退格可以退一格
回车可以回到行首
但是请问怎么样才能回到上一行呢?{:10_266:} 在python的交互界面以及字符界面运行的代码,在输出一行换行后是没办法把光标移动到上一行的。 txxcat 发表于 2020-6-8 16:46
在python的交互界面以及字符界面运行的代码,在输出一行换行后是没办法把光标移动到上一行的。
C++...... Twilight6 发表于 2020-6-8 16:48
C++......
{:10_278:} 没人吗{:10_266:} 定义光标位置。win有不少系统函数,其中就可以定义光标位置。先得到标准输出句柄,再获取光标。定位光标。总之很麻烦。当初我有笔记。给你查查:
#include<windows.h>
首先定义一个句柄:
HANDLE h;
获取标准输出句柄:
h=GetStdHandle(STD_OUTPUT_HANDLE);
获取屏幕坐标:
COORD pos;
输入光标位置:
cin>>pos.X;
cin>>pos.Y;
设置控制台光标位置:
SetConsoleCursorPosition(h,pos); 在 *nix terminal 中
\x1b[%dA 表示向上 %d 行
https://www.man7.org/linux/man-pages/man4/console_codes.4.html package main
import (
"fmt"
"strings"
"time"
"github.com/morikuni/aec"
)
func main() {
const n = 20
builder := aec.EmptyBuilder
up2 := aec.Up(2)
col := aec.Column(n + 2)
bar := aec.Color8BitF(aec.NewRGB8Bit(64, 255, 64))
label := builder.LightRedF().Underline().With(col).Right(1).ANSI
// for up2
fmt.Println()
fmt.Println()
for i := 0; i <= n; i++ {
fmt.Print(up2)
fmt.Println(label.Apply(fmt.Sprint(i, "/", n)))
fmt.Print("[")
fmt.Print(bar.Apply(strings.Repeat("=", i)))
fmt.Println(col.Apply("]"))
time.Sleep(100 * time.Millisecond)
}
}
原理是一样的,找了一个 go 的三方库
#include <unistd.h>
#include <stdio.h>
void up(int lines) {
if (lines > 0) {
printf("\x1b[%dA", lines);
}
}
void column(int col, const char *str) {
if (col >= 0) {
printf("\x1b[%dG%s\x1b[0m", col, str);
}
}
int main() {
int n = 20;
printf("\n\n");
for (int i = 0; i <= n; i++) {
up(2);
char buf = {0};
sprintf(buf, "%d/%d\n", i, n);
column(n, buf);
printf("[");
for (int j = 0; j <= i; j++) {
printf("=");
}
column(n + 2, "]");
printf("\n");
sleep(1);
}
return 0;
}
页:
[1]