将文本光标移动到特定的屏幕坐标?

时间:2012-05-01 17:35:44

标签: c++ c windows console

如何在C或C ++中将光标设置在控制台上的所需位置?

我记得一个名为gotoxy(x,y)的函数,但我认为它已被弃用了。还有其他选择吗?

7 个答案:

答案 0 :(得分:4)

C和C ++都没有任何屏幕或控制台的概念;它们只能看到没有固有显示特性的字节流。有许多第三方API,例如ncurses,可以帮助您实现这一目标。

如果您想要一个快速解决方案,您正在使用的终端了解ANSI escape sequences,那么您可以执行以下操作:

printf("\033[%d;%dH", row, col);

将光标移动到特定的行和列(左上角为{1,1})。不过你最好使用ncurses(或者你的平台的等价物)。

答案 1 :(得分:3)

使用SetConsoleCursorPosition

MSDN库的同一部分还有许多其他功能。其中一些也可能有用。

答案 2 :(得分:1)

如果您在谈论ncurses库,您所使用的功能是move (row, column)

答案 3 :(得分:1)

我使用一种非常简单的方法。你不需要知道HANDLE是什么,除非你真的潜入控制台应用程序,COORD对象在windows.h标准库中并且有两个成员数据整数X和Y. 0,0是左上角角落和Y增加到屏幕下方。您可以使用此命令并继续使用std :: cout<<打印你需要的任何东西。

#include <windows.h>

int main(void){
//initialize objects for cursor manipulation
HANDLE hStdout;
COORD destCoord;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

//position cursor at start of window
destCoord.X = 0;
destCoord.Y = 0;
SetConsoleCursorPosition(hStdout, destCoord);
}

答案 4 :(得分:1)

您可以使用它来将光标设置为屏幕上的特定坐标,然后只需使用cout <<或printf语句即可在控制台上打印任何内容:

var body: some View {
    ScrollView {
        ForEach(0..<100, id: \.self) { number in
            Text("\(number)")
        }
    }
}

答案 5 :(得分:0)

这是在stackoverflow上...

`#include <stdio.h>

// ESC-H, ESC-J (I remember using this sequence on VTs)
#define clear() printf("\033[H\033[J")

//ESC-BRACK-column;row (same here, used on terminals on an early intranet)
#define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))

int main(void)
{
    clear();
    gotoxy(23, 12);
    printf("x");
    gotoxy(1, 24);
    return 0;
}`

答案 6 :(得分:-1)

我想出了这个来设置光标。

#include <iostream>

void setPos(std::ostream& _os, const std::streamsize& _x, const std::streamsize& _y)
{
    char tmp = _os.fill();

    if(_y>0) {
            _os.fill('\n');
            _os.width(_y);
            _os << '\n';
    }
    if(_x>0) {
            _os.fill(' ');
            _os.width(_x);
            _os << ' ';
    }
    _os.flush();
    _os.fill(tmp);
}

int main(int argc, char **argv)
{
    setPos(std::cout, 5, 5);
    std::cout << "foo" << std::endl;
    return 0;
}

要做更多事情,您需要对分辨率或类似ncurses的库进行假设。