用C在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; } 

编辑按照评论

经过一些测试,这(或多或少) cls命令是如何在cmd.exe实现的(至少在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; }