liuzhengyuan 发表于 2020-6-8 16:17:29

关于退格(\b)和回车(\r)的一些问题

本帖最后由 liuzhengyuan 于 2020-6-20 14:21 编辑

我知道退格可以退一格
回车可以回到行首
但是请问怎么样才能回到上一行呢?{:10_266:}

txxcat 发表于 2020-6-8 16:46:42

在python的交互界面以及字符界面运行的代码,在输出一行换行后是没办法把光标移动到上一行的。

Twilight6 发表于 2020-6-8 16:48:00

txxcat 发表于 2020-6-8 16:46
在python的交互界面以及字符界面运行的代码,在输出一行换行后是没办法把光标移动到上一行的。

C++......

txxcat 发表于 2020-6-8 16:56:40

Twilight6 发表于 2020-6-8 16:48
C++......

{:10_278:}

liuzhengyuan 发表于 2020-6-14 15:39:17

没人吗{:10_266:}

405794672 发表于 2020-6-15 16:56:11

定义光标位置。win有不少系统函数,其中就可以定义光标位置。先得到标准输出句柄,再获取光标。定位光标。总之很麻烦。当初我有笔记。给你查查:
#include<windows.h>
首先定义一个句柄:
HANDLE h;
获取标准输出句柄:
h=GetStdHandle(STD_OUTPUT_HANDLE);
获取屏幕坐标:
COORD pos;
输入光标位置:
cin>>pos.X;
cin>>pos.Y;
设置控制台光标位置:
SetConsoleCursorPosition(h,pos);

赚小钱 发表于 2020-6-16 11:08:30

在 *nix terminal 中
\x1b[%dA 表示向上 %d 行

https://www.man7.org/linux/man-pages/man4/console_codes.4.html

赚小钱 发表于 2020-6-16 11:23:08

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 的三方库

赚小钱 发表于 2020-6-16 11:45:45

#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]
查看完整版本: 关于退格(\b)和回车(\r)的一些问题