gpt4 book ai didi

c++ - 覆盖写入控制台的文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:54 26 4
gpt4 key购买 nike

我想实现以下目标:我有一个生成文件的程序,如果具有给定名称的文件已经存在,它应该打印一条警告,询问用户是否应该覆盖它。它看起来像下面这样:

Processing file                     test.sdf
Checking SDF file... [OK]
Parsing SDF... [OK]
Generating NDDL model file... [WARN]
Warning. The file "/home/chris/models/test-model.nddl" already exists. Overwrite? [y/N]

现在,如果用户决定要做什么,我想将控制台光标倒回到 [ [WARN] 的字符, 并用 [OK] 覆盖它或 [FAIL] , 然后用程序的下一个输出覆盖以下行。

我发现我可以使用 ANSI 控制序列来实现这一点。因为我只使用 Ubuntu,所以我对此没有意见。

我想到了两个想法:

1) 倒回光标直到找到字符串 [WARN]然后再开始写。

2) 逐行向上移动光标直到Generating NDDL model file... [WARN]行被删除,并用例如 Generating NDDL model file... [FAIL] 覆盖它.

但是对于这两种方法,我都遇到了一个我无法解决或无法通过谷歌搜索找到方法的问题...

问题 1):我不知道如何读取当前光标位置的字符。但无论如何,我认为这不是一个好主意。它似乎并不可靠。

问题 2):由于输入文件的路径可以是任意的,我无法控制在 [WARN] 之后打印的行数。出现,所以我只是不知道有多少std::cout << "\033[F" << "\033[2K" << std::flush;我应该运行(用于移动光标一行和清除所有内容的 ANSI 控制序列)。另外,我不知道终端窗口的宽度有多大,所以我也无法计算它(虽然不知道这是否是个好主意......)

我确信一定有办法实现这一点,但我就是想不出一个好的、可靠的方法...

你们有人知道吗?我感谢各种帮助

最佳答案

X/Y问题

如果您坚持直接操作控制台,那么为什么不完全返回最后两行呢?当您可以重印整个内容时,为什么还要尝试编辑一行。此外,您不能保证能够在平台和 shell 之间以相同的方式操作每个控制台。

您正在打印行,您应该很容易知道要备份和覆盖多少行。如果您做不到,只需清除屏幕并重新写回所有内容。

解决方案

呈现这样的界面的正确方法是使用curses 库(或等效项)并完全控制控制台的输出。这使您可以完全控制。

如果您认为这矫枉过正,那么您注定要重新创建curses 的功能,但最终会搞得一团糟。

关于c++ - 覆盖写入控制台的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com