在使用cin之前打印“cout”?

3

我有一个小问题,不确定是否有可能通过iostream的代码解决,但我认为值得问一下。

#include <iostream>
#include <string>

using namespace std;

string cmd;

int main() {

cout << "-------------" << endl;
cout << "command: ";
cin >> cmd;
cout << "-------------" << endl;
system("pause");
}

用户在输入cmd变量之前,是否有任何方式可以打印第三个cout行呢?这样,文本字段将用上下"-"包装,看起来像这样:

-------------
command: <user would type here>
-------------

如果这不可行,您能否指向一些我可以使用以达到此目的的可能库?

4
可以,但你需要问自己:这值得吗? - bolov
嗨@bolov,我正在制作一个基于文本的冒险游戏,UI将由此包围文本字段,因此,如果我能在这个例子中简单地弄清楚如何做到这一点,那么在构建我的UI时,我可以进一步实现它。 - open surce
你听说过PDCurses吗? - Eljay
嗨@Eljay,我已经尝试过了,但是我很难掌握所有的内容,因为我找不到所有函数等方面的可靠文档。这是您推荐的吗?如果是的话,我会全力以赴并深入研究。 - open surce
@Eljay 对于像这样的简单任务,你会推荐什么? - open surce
显示剩余3条评论
2个回答

3

在C++中,没有标准的方法来实现这一点。

不同的终端具有自己的功能,不同的系统具有与终端交互的API。

在等待输入之前,必须首先执行底部行的输出,但可能可以将输出“光标”移动到屏幕底部以外的其他位置。您可以在您打算针对的系统的文档中找到详细信息。


1
我建议您可以尝试使用SetConsoleCursorPosition function函数,在指定的控制台屏幕缓冲区中设置光标位置。
以下代码使用SetConsoleCursorPosition()将当前输出位置移动到第1行,第9列:
#include <iostream>
#include <string>

#include <windows.h>

using namespace std;

string cmd;

int main()
{


    cout << "-------------\n" << "command:  \n" << "-------------" << endl;


    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    if (INVALID_HANDLE_VALUE != hConsole)
    {
        COORD pos = {9, 1 };
        SetConsoleCursorPosition(hConsole, pos);
        cin >> cmd;
    }


    system("pause");

}

enter image description here


这正好符合我的要求,谢谢!现在我应该能够通过操纵光标位置来构建我的UI的其余部分了!我有两个问题,"hConsole"是什么意思?(也许是控制台的某些参考?)if语句实际上检查了什么? - open surce
hConsole:控制台屏幕缓冲区的句柄。在调用CreateConsoleScreenBuffer函数时,您可以为控制台屏幕缓冲区指定安全描述符。如果函数成功,则返回值是新控制台屏幕缓冲区的句柄。如果函数失败,则返回值为INVALID_HANDLE_VALUE。if语句是为了确保控制台屏幕缓冲区的句柄具有GENERIC_READ访问权限 - Jeaninez - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接