在cin之前打印“cout”?

Posted

技术标签:

【中文标题】在cin之前打印“cout”?【英文标题】:Print "cout" before cin? 【发布时间】:2019-09-04 20:42:47 【问题描述】:

我有一个小问题,我不确定 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>
-------------

如果这是不可能的,请您指出我可以用来实现这一目标的一些可能的库的方向吗?

【问题讨论】:

是的,你可以,但你必须问自己:值得吗? 您需要某种光标控制库。一些命令行允许您使用转义序列移动光标。这真的取决于你的环境。 嗨@bolov,我正在制作一个基于文本的冒险游戏,用户界面将包含围绕文本字段的内容,所以如果我能在这个例子中简单地弄清楚如何做到这一点,我可以在构建 UI 时进一步实现它 你听说过PDCurses吗? 嗨@Eljay,我有,我只是努力掌握这一切,因为我找不到关于所有功能等的可靠文档。这是你推荐的吗?如果是这样,我会全力以赴并对此进行调查。 【参考方案1】:

在 C++ 中没有实现此目的的标准方法。

不同的终端有自己的能力,不同的系统有自己的API用于与终端交互。

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

【讨论】:

【参考方案2】:

我建议你可以尝试使用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");


【讨论】:

这完全符合我的要求,谢谢!我现在应该能够通过操纵光标位置来构建我的 UI 的其余部分了!我只有 2 个问题,“hConsole”得到了什么? (可能是控制台的一些参考?) if 语句实际检查的是什么? hConsole:控制台屏幕缓冲区的句柄。您可以在调用CreateConsoleScreenBuffer function 时为控制台屏幕缓冲区指定安全描述符。如果函数成功,返回值是新的控制台屏幕缓冲区的句柄。如果函数失败,返回值是INVALID_HANDLE_VALUE。if语句是为了确保控制台屏幕缓冲区的句柄有GENERIC_READ access。跨度>

以上是关于在cin之前打印“cout”?的主要内容,如果未能解决你的问题,请参考以下文章

在等待 cin 时读取/打印套接字输出(不支持多线程)

打印沙漏

算法题,打印沙漏

C++中cin,cout是否效率不如scanf,printf

C++中cin和cout的具体用法是怎么样的?

[Algorithms] 打印菱形的另一种方法