c++ 是否有上行字符?(\n的对面)

pqwbnv8z  于 2023-01-06  发布在  其他
关注(0)|答案(6)|浏览(134)

我想在串行控制台中覆盖上面一行中的内容。是否有允许我上移的字符?

2cmtqfgy

2cmtqfgy1#

大多数终端都能理解ANSI escape codes,本用例相关代码:

  • "\033[F"-将光标移动到上一行的开头
  • "\033[A"-将光标上移一行

示例(Python):

print("\033[FMy text overwriting the previous line.")
rsaldnfx

rsaldnfx2#

不,这并不容易,因为你必须使用像curses library这样的东西,特别是如果你想对光标位置有更多的控制,并通过编程做更多的事情。
这里有一个Programming with Curses上的Python文档的链接,这个简短的tutorial/example可能也会感兴趣。
我刚刚在docs中发现了这张纸条,以防您使用Windows:
还没有人将curses模块移植到Windows平台。在Windows平台上,可以尝试Fredrik Lundh编写的Console模块。Console模块提供光标可寻址的文本输出,以及对鼠标和键盘输入的完全支持,并且可以从http://effbot.org/zone/console-index.htm获得。
我相信对于CNCurses库,如果你想用C浏览,链接页面有一个关于移动光标的部分。

  • 很久 * 以前,我在C语言中使用curses库非常成功。
    • 更新**:

我错过了关于在终端上/串行地运行这个的部分,因为ANSI转义序列,特别是对于像你这样的简单任务,将是最容易的,我同意@SvenMarnach对此的解决方案。

iq3niunx

iq3niunx3#

for i in range(10):  
    print("Loading" + "." * i) 

    doSomeTimeConsumingProcessing()

    sys.stdout.write("\033[F") # Cursor up one lin

在Python中尝试一下,并将doSomeTimeConsumingProcessing()替换为所需的任何例程,希望它能有所帮助

wgx48brx

wgx48brx4#

回车符可以用来转到行首,ANSI代码ESC A"\033[A")可以让你上移一行,这可以在Linux上使用,也可以在Windows上使用colorama包来启用ANSI代码:

import time
import sys
import colorama

colorama.init()

print("Line 1")
time.sleep(1)
print("Line 2")
time.sleep(1)
print("Line 3 (no eol)", end="")
sys.stdout.flush()
time.sleep(1)
print("\rLine 3 the sequel")
time.sleep(1)
print("\033[ALine 3 the second sequel")
time.sleep(1)
print("\033[A\033[A\033[ALine 1 the sequel")
time.sleep(1)
print()  # skip two lines so that lines 2 and 3 don't get overwritten by the next console prompt
print()

输出:

> python3 multiline.py
Line 1 the sequel
Line 2
Line 3 the second sequel
>

实际上,colorama可能使用SetConsoleMode来启用Console Virtual Terminal Sequences

jucafojl

jucafojl5#

我也许错了,但是:

#include <windows.h>

void gotoxy ( int column, int line )
{
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
}

在windows标准控制台中。

wfypjpf4

wfypjpf46#

基于@Sven Marnach答案的简单方法:

print(f'\033[A\rxxx')
  • \033[A:将光标向上移动一行。
  • \r:将光标移动到行首。
  • xxx:要打印的字符串。如果是变量,则为{xxx}

如果你的字符串后面有一些来自前一行的多余字符,根据前一行的尺子,用白色覆盖它们。

print(f'\033[A\rxxx{' '* 10}')

相关问题