获取Win32控制台中输出的行数?

时间:2015-03-09 23:08:58

标签: c

我正在尝试使用一些业余C编程来创建自己的函数来清除控制台输出列。我想在调用函数时获取控制台输出中的行数,以便我可以将光标移动到每行中的指定列,将该列上的空格重写为空格,然后转到下一行。不幸的是,当它到达最后一行时我无法结束循环。

我应该如何获得当前控制台输出中的行数?

2 个答案:

答案 0 :(得分:2)

初始化内容需要几个步骤,但提供您要查找的信息的调用是GetConsoleScreenBufferInfo

至少,您需要一个指向控制台的句柄(文件描述符)。您可以使用GetStdHandle,例如

来完成此操作
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

答案 1 :(得分:1)

假设你#include <Windows.h>,你可以这样做:

HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;

GetConsoleScreenBufferInfo(console, &screen);

然后访问尺寸就像输入screen.dwSize.X(宽度)&amp; screen.dwSize.Y(身高),但这会产生问题,XY尺寸的大小不一定是显示的缓冲区的大小。

所以在我的电脑上,如果我这样做:

printf("X:%d - Y:%d\n", screen.dwSize.X, screen.dwSize.Y);

当可见Y尺寸仅为25时显示X:80 - Y:1000,但我可以滚动1000长度。

如何获得当前可见的输出大小我不确定,但这是一个清除整个屏幕缓冲区的函数:

void clearScreen(void) {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}

用于光标控制的简单gotoxy函数:

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