如何使用C ++在Windows和Linux中清除控制台

时间:2008-10-23 05:23:04

标签: c++ windows linux console cross-platform

我需要一个跨平台解决方案来清除用C ++编写的Linux和Windows控制台。这样做有什么功能吗?另请注意,我不希望最终用户程序员必须更改程序中的任何代码以使其清除Windows vs Linux(例如,如果必须在两个函数之间进行选择,则必须做出决定在运行时或在编译时自动执行。)

13 个答案:

答案 0 :(得分:53)

clear the console on both platforms没有通用命令。

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}

答案 1 :(得分:28)

简短回答:你不能。

更长的答案:使用curses库(Unix上的ncurses,Windows上的pdcurses)。 NCurses应该可以通过你的包管理器获得,并且ncurses和pdcurses都具有完全相同的接口(pdcurses也可以独立于控制台创建窗口,其行为类似于控制台窗口)。

最困难的答案:使用#ifdef _WIN32等类似内容使您的代码在不同的操作系统上采取不同的行为。

答案 2 :(得分:13)

在linux上可以清除控制台。最好的方法是将以下转义序列写入stdout:

write(1,"\E[H\E[2J",7);

这是 / usr / bin / clear 所做的,没有创建另一个进程的开销。

答案 3 :(得分:10)

一个简单的技巧:为什么不使用宏结合使用system()命令清除控制台来检查操作系统类型? 这样,您将使用适当的控制台命令作为参数执行系统命令。

#ifdef _WIN32
#define CLEAR "cls"
#else //In any other OS
#define CLEAR "clear"
#endif

//And in the point you want to clear the screen:
//....
system(CLEAR);
//....

答案 4 :(得分:4)

发布的问题是无法回答的,因为它强加了不可能的限制。 “清除屏幕”是针对不同操作系统的非常不同的操作,以及如何操作 特定于操作系统。有关如何在具有“控制台”和具有“终端”的平台的多个流行平台上执行此操作的完整说明,请参阅this Frequently Given Answer。你还会发现in the same place对要避免的常见错误的一些解释,其中有几个是 - 唉! - 以上给出的答案。

答案 5 :(得分:3)

这是您在任何其他平台上执行此操作的方法,但它在Windows中不起作用:

cout << "\f";

也许您需要进行条件编译:

void clrscr()
{
#ifdef _WIN32
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    FillConsoleOutputCharacter(hStdOut, ' ',
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coord, &count);
    SetConsoleCursorPosition(hStdOut, coord);
#else
    cout << "\f";
#endif
}

答案 6 :(得分:3)

简短回答

void cls(void)
{
    system("cls||clear");
    return;
}

答案很长,请阅读:

system("pause") clarification

答案 7 :(得分:2)

我知道这不是回答我自己的问题但是! 这适用于Windows(#include <windows.h>):

void clrscr()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);

    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

    SetConsoleCursorPosition(hStdOut, coord);
}

答案 8 :(得分:1)

有一个非常接近清除屏幕的替代方案。您可以尝试使用for循环重复新行。例如:

for (i = 0; i < 100000; i++)
{
  printf ("\n\n\n\n\n");
}

在你完成这个循环后,终端不允许你回滚到你在顶部的位置,这是一种非常专业的常识。它并没有直接回答你的要求,但它可以起作用。

答案 9 :(得分:1)

此代码在Windows和Unix中清除控制台(虽然实际编译方式不同):

// File: clear_screen.h
#ifndef _CLEAR_SCREEN_H
#define _CLEAR_SCREEN_H
void clearScreen(void); /* Clears the screen */
#endif /* _CLEAR_SCREEN_H */
// File: clear_screen.c
#ifdef _WIN32
#include <windows.h>
void clearScreen(void) {
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD topLeft = {0, 0};
    DWORD dwCount, dwSize;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hOutput, &csbi);
    dwSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hOutput, 0x20, dwSize, topLeft, &dwCount);
    FillConsoleOutputAttribute(hOutput, 0x07, dwSize, topLeft, &dwCount);
    SetConsoleCursorPosition(hOutput, topLeft);
}
#endif /* _WIN32 */

#ifdef __unix__
#include <stdio.h>
void clearScreen(void) {
    printf("\x1B[2J");
}
#endif /* __unix__ */

答案 10 :(得分:1)

正如其他人已经说过的那样,没有办法在 Windows 和 Linux 上使用一段相同的代码来清除控制台。

我也强烈建议不要使用std::system

  • 它使您的程序容易受到攻击;如果有人用自己的恶意程序替换了 clear/cls 会怎样
  • 由于上述原因,防病毒程序讨厌 std::system。如果您的代码使用它,则生成的二进制文件可能会被检测出病毒阳性,即使它是无害的。 (请注意,它并非实际上是无害的。)

这是我的解决方案:

#ifdef _WIN32
#include <Windows.h>
#endif

void clrscr() {
#ifdef _WIN32
    COORD tl = { 0,0 };
    CONSOLE_SCREEN_BUFFER_INFO s;
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(console, &s);
    DWORD written, cells = s.dwSize.X * s.dwSize.Y;
    FillConsoleOutputCharacter(console, ' ', cells, tl, &written);
    FillConsoleOutputAttribute(console, s.wAttributes, cells, tl, &written);
    SetConsoleCursorPosition(console, tl);
#else
    std::cout << "\033[2J\033[1; 1H";
#endif
}

您可以按照上面显示的模式,随意更改两个代码段。

答案 11 :(得分:-2)

不会

for (int i=0;i<1000;i++){cout<<endl;}

清除所有操作系统中的屏幕?

答案 12 :(得分:-3)

如果您正在使用控制台

,这应该有效
#include <conio.h>

int main()

{
    clrscr();
}