C++控制台插入文本而不覆盖

3
我有一个C++函数需要被某个线程调用;该函数使用ANSI将一行文本插入控制台,而不中断当前用户输入。
这很好用,直到控制台底部被占满,用户输入被覆盖,因为控制台没有自动滚动,就像这样:

Screenshot of CLI error.

代码:

void log_insert(std::string& line)
{
    static int num_of_lines = 1;

    // save horizontal cursor position
    std::cout << "\033[s";

    // insert <X> number of lines (\033[<X>L)
    std::cout << "\033[" << num_of_lines + 1 << "L";

    // move cursor to beginning
    std::cout << "\033[G";

    // print text
    std::cout << line << "\n";

    // restore horizontal cursor position
    std::cout << "\033[u";

    // move down <X> number of lines
    std::cout << "\033[" << num_of_lines + 1 << "B";
}

我知道有一些用于CLI的库,但我觉得这应该是一个很简单的问题。我尝试使用ANSI滚动,但没有成功。


C++没有控制控制台的概念。您如何以及在何种程度上与特定的控制台终端程序交互完全取决于后者。 - πάντα ῥεῖ
我明白你的意思;但我在想是否可以使用ANSI转义码来保持“输入行”的焦点。 - Androvich
没有标准化的行为来执行那个操作。 - πάντα ῥεῖ
1个回答

0
您可以使用以下方法将控制台光标设置到开头,从而解决问题:

void setCursor(int x, int y) {
    HANDLE hOut;
    COORD position;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    position.X = x;
    position.Y = y;
    SetConsoleCursorPosition(hOut, position);
}

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