C++ - 等待用户输入并打印下一行

7

我正在使用ASCII制作GUI界面。我想等待用户输入,但同时又需要打印ASCII边框的最后一行。目前的情况是等待用户输入,然后再打印ASCII边框的最后一行。有没有什么方法可以解决这个问题?

以下是我想要的示例:

登录界面

======================================================

        Welcome to Bank Beta 0.1
        ------------------------

        (1)Login
        (2)Create Account


        USER INPUT HERE

======================================================

我收到的示例:

======================================================

        Welcome to Bank Beta 0.1
        ------------------------

        (1)Login
        (2)Create Account


        USER INPUT HERE

这是我的代码:

在这里展示:

void login ()
{
    cout << "======================================================" << endl
        << "\t\tWelcome to Bank Beta 0.1" << endl
        << "\t\t------------------------" << endl << endl
        << "\t\t (1)Login" << endl
        << "\t\t (2)Create Account" << endl << endl;
}
int main()
{ 
    int loginChoice;
    login();
    cin >> loginChoice;
    cout << "======================================================" << endl;
    _getch();
}

将“cin >> loginChoice”后面的代码行添加到您的登录函数中即可。此外,要注意endl会刷新您的流。尽量使用“\n”,直到最后一行,您可以在那里进行刷新。 - The Marlboro Man
3
我认为ncurses可能能够满足你的需求。 - sweerpotato
1
如果我在我的登录函数中添加 cin,它会提示用户并且不允许边框打印,直到用户输入完毕? - Max Mcgregor
1
std::cin和std::cout是独立的输入和输出流,因此,如果在“(c)in(put)”用户选择之前“out(put)”边框,它将被打印。只需尝试一下:在所有的“couts”之后放置“cin”。请注意:如果您试图使用户将其输出“放在”底部边框上方,这将不起作用!代码是顺序的,cin“阻塞”代码执行。有(非便携式)设置光标位置的方法,但在我看来不值得。如果您正在尝试制作GUI,最好检查ncurses,如上所述。 - The Marlboro Man
正如@sweerpotato所说:ncurses可能可以实现你想要的功能。 - mtszkw
显示剩余2条评论
1个回答

8

由于你正在处理基于控制台的GUI,建议使用某种光标移动功能。 这将在“对象”对齐方面节省大量时间。

以下是用于在Windows和Unix中移动光标所需的代码:

#ifdef _WIN32

    #include <windows.h>

    void gotoxy(int x, int y)
    {
        COORD p = { x, y };
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
    }

    #else

    #include <unistd.h>
    #include <term.h>

    void gotoxy(int x, int y)
    {
        int err;
        if (!cur_term)
        if (setupterm(NULL, STDOUT_FILENO, &err) == ERR)
            return;
        putp(tparm(tigetstr("cup"), y, x, 0, 0, 0, 0, 0, 0, 0));
    }

#endif 

如果您不需要平台独立性,可以删除它们中的任何一个,但同时拥有它们并不会造成任何损害。现在进入有趣的部分:

void login ()
{
    cout << "======================================================" << "\n"
    << "\t\tWelcome to Bank Beta 0.1" << "\n"
    << "\t\t------------------------" << "\n\n"
    << "\t\t (1)Login" << "\n"
    << "\t\t (2)Create Account" << "\n\n";
    gotoxy(0, 7);
    cout << "======================================================" << "\n";
    gotoxy(0, 6);
    cout << "\t\t";
}
int main()
{ 
    int loginChoice;
    login();
    gotoxy(0,8);
    cin >> loginChoice;
    _getch();
}

现在写入和读取是相互独立的,您还可以更轻松地混合所有位置。


1
ncurses 似乎也可以以跨平台的方式完成这项工作:http://invisible-island.net/ncurses/man/tput.1.html - James
1
作为一个旁注,在主程序中,应该是'gotoxy(0,8)'而不是'goto(0,8)'吗? - Aserre
是的,Ploutox是正确的,我的错误是在主函数中写成了'gotoxy(0,8)'。 - Alex Rusu

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