【问题标题】:Insert newline into output stream在输出流中插入换行符
【发布时间】:2020-05-16 21:54:19
【问题描述】:

假设我们有一个终端,我们的程序打印了一些文本:

line 1
line 2
line 3

然后我们回到第 3 行的开头。我想打印一些文本而不覆盖以前打印的文本(我不想使用 ncurse),所以我希望它看起来像:

line 1
line 2
inserted line
line 3

如果我只打印\n,我会得到奇怪的格式。 有没有办法做到这一点?

更多信息:
我有另一个线程记录一些数据,还有一个 > 用于用户输入,就像这样:

[info]: log 
> command

当它记录更多时,它应该看起来像:

[info]: log 
[info]: more log 
>command

不,它不同于this 的帖子。 在最后一行,我不知道用户输入了什么,所以我不能只是转载。 也许关闭缓冲(这样我就可以在用户不按回车的情况下获得输入),并且还禁用字符回显,以便我可以完全操纵终端,但这太复杂了,我不知道谁在 Windows 上禁用回显。

【问题讨论】:

标签: c++ newline cout


【解决方案1】:

(我不想使用 ncurse)

没有通用的方法来做到这一点。 C/C++ 流基本上是文件并且行为方式相同:如果要在文件中插入一行,则需要从插入点重写文件。这同样适用于您的输入,它也可能来自文件而不是键盘。

根据您的操作系统,有不同的方式来执行“图形化”操作。在类 Unix 系统上,ncurses 发出定位字符的转义码,假设终端支持这些代码(有 ANSI 转义码、xterm 代码、WYSE 代码、vt100 代码等)。在 DOS 下,编译器有自己的库调用( setCursorPosition()、gotoxy() 等)。光标定位通常被认为是一种“图形化”操作。

基本上,使用 ncurses,您会想要分割屏幕并在提示后将输入行设置在底部。然后,在打印之前,抓住当前光标位置并滚动屏幕顶部,打印文本,然后在输入点恢复当前位置。

基于这个答案 - Subwindows with ncurses - ncurses 似乎让这变得更加简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2012-03-05
    • 2014-01-09
    • 2010-10-26
    相关资源
    最近更新 更多