[英]Clear command prompt with C on windows
是否可以使用Windows上的C在命令提示符下清除輸出?
例如,在linux上我可以做到
printf("\033[2J");
但據我所知,Windows無法識別ANSI轉義碼謝謝。
編輯:我想我還需要在清除之后將光標恢復到下一個輸出的0,0 ...
在Windows上有很多方法可以做到這一點。
你包括conio.h
並調用_clrscr();
或者你可以打電話給system("cls");
就像conio.h
或系統調用的替代方案一樣,只是一個實現(我認為類似於conio庫),它是如何在windows中完成的。
#include <windows.h>
int main(void){
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
DWORD dwCells, dwWritten;
// Get console handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// Retrieve console information
if (GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) {
// Calc console cells
dwCells = csbiInfo.dwSize.Y * csbiInfo.dwSize.X;
// Initialize cursor position
csbiInfo.dwCursorPosition.X = 0;
csbiInfo.dwCursorPosition.Y = 0;
// Replace all characters in console with spaces
FillConsoleOutputCharacterA( hStdout, ' ', dwCells, csbiInfo.dwCursorPosition, &dwWritten);
// Replace all attributes in console with the default
FillConsoleOutputAttribute( hStdout, csbiInfo.wAttributes, dwCells, csbiInfo.dwCursorPosition, &dwWritten );
// Position the cursor
SetConsoleCursorPosition( hStdout, csbiInfo.dwCursorPosition );
}
return 0;
}
編輯以關注評論
經過一些測試,這(或多或少)是如何在cmd.exe
實現cls
命令的(至少在windows 7 64中)
#include <windows.h>
int main(void){
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
COORD destinationPoint;
SMALL_RECT sourceArea;
CHAR_INFO Fill;
// Get console handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// Retrieve console information
if (GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) {
// Select all the console buffer as source
sourceArea.Top = 0;
sourceArea.Left = 0;
sourceArea.Bottom = csbiInfo.dwSize.Y - 1;
sourceArea.Right = csbiInfo.dwSize.X - 1;
// Select a place out of the console to move the buffer
destinationPoint.X = 0;
destinationPoint.Y = 0 - csbiInfo.dwSize.Y;
// Configure fill character and attributes
Fill.Char.AsciiChar = ' ';
Fill.Attributes = csbiInfo.wAttributes;
// Move all the information out of the console buffer and init the buffer
ScrollConsoleScreenBuffer( hStdout, &sourceArea, NULL, destinationPoint, &Fill);
// Position the cursor
destinationPoint.X = 0;
destinationPoint.Y = 0;
SetConsoleCursorPosition( hStdout, destinationPoint );
}
return 0;
}
不是調用api函數來填充具有所需字符和屬性的緩沖區,而是滾動整個緩沖區,並且當滾動操作填充空區域時,緩沖區被初始化。 一個api電話。
編輯這是ansi轉義序列的“等效”代碼。 清除控制台但保留歷史記錄。 這不會初始化完整的控制台緩沖區,只能確保控制台窗口是干凈的,滾動可見窗口或緩沖區(如果需要)。
#include <windows.h>
int main(void){
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
COORD destinationPoint;
SMALL_RECT sourceArea;
CHAR_INFO Fill;
SHORT delta, end;
// Get console handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// Retrieve console information
if (GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) {
// How many lines needs the window to be moved to be clear
delta = (csbiInfo.dwCursorPosition.Y) - csbiInfo.srWindow.Top;
// Where the bottom of the window will fall after moving
end = csbiInfo.srWindow.Bottom + delta;
// If the window get out of the console buffer, it is necessary to scroll the buffer
if (end >= csbiInfo.dwSize.Y){
// Select all the console buffer as source
sourceArea.Top = 0;
sourceArea.Left = 0;
sourceArea.Bottom = csbiInfo.dwSize.Y-1;
sourceArea.Right = csbiInfo.dwSize.X-1;
// Select the target point for the movement
destinationPoint.X = 0;
destinationPoint.Y = 0 - delta ;
// Configure fill character and attributes for the empty area
Fill.Char.AsciiChar = ' ';
Fill.Attributes = csbiInfo.wAttributes;
// Scroll the buffer and init the end zone
ScrollConsoleScreenBuffer( hStdout, &sourceArea, NULL, destinationPoint, &Fill);
// Adjust new cursor position
destinationPoint.X = 0;
destinationPoint.Y = csbiInfo.dwSize.Y - (csbiInfo.srWindow.Bottom - csbiInfo.srWindow.Top + 1);
} else {
// No buffer scroll is needed. Adjust the new cursor position
destinationPoint.X = 0;
destinationPoint.Y = csbiInfo.dwCursorPosition.Y + 1;
}
// In any case, the visible window needs to be moved depending on the new cursor position
sourceArea.Top = destinationPoint.Y;
sourceArea.Left = destinationPoint.X;
sourceArea.Bottom = destinationPoint.Y + (csbiInfo.srWindow.Bottom - csbiInfo.srWindow.Top + 1) -1 ;
sourceArea.Right = csbiInfo.dwSize.X-1;
// Place the visible window in the required place over the buffer
SetConsoleWindowInfo(hStdout, TRUE, &sourceArea);
// Place the cursor in its final position
SetConsoleCursorPosition( hStdout, destinationPoint );
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.