我正在尝试使用一些业余C编程来创建自己的函数来清除控制台输出列。我想在调用函数时获取控制台输出中的行数,以便我可以将光标移动到每行中的指定列,将该列上的空格重写为空格,然后转到下一行。不幸的是,当它到达最后一行时我无法结束循环。
我应该如何获得当前控制台输出中的行数?
答案 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
(身高),但这会产生问题,X
或Y
尺寸的大小不一定是显示的缓冲区的大小。
所以在我的电脑上,如果我这样做:
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);
}