鱼C论坛

 找回密码
 立即注册
查看: 1860|回复: 8

[已解决]关于退格(\b)和回车(\r)的一些问题

[复制链接]
发表于 2020-6-8 16:17:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

我知道退格可以退一格
回车可以回到行首
但是请问怎么样才能回到上一行呢?
最佳答案
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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-8 16:46:42 | 显示全部楼层
在python的交互界面以及字符界面运行的代码,在输出一行换行后是没办法把光标移动到上一行的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

C++......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-8 16:56:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 15:39:17 | 显示全部楼层
没人吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-16 11:08:30 | 显示全部楼层
在 *nix terminal 中
\x1b[%dA
表示向上 %d 行

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
liuzhengyuan + 5 + 5 + 3 感谢回答

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

ezgif.com-video-to-gif.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[20] = {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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表