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

2024-11-08 09:04:00
admin
原创
228
摘要:问题描述:我需要一个用 C++ 编写的跨平台解决方案,用于清除 Linux 和 Windows 中的控制台。是否有任何函数可以执行此操作?另请注意,我不希望最终用户程序员必须更改我的程序中的任何代码才能使其清除 Windows 或 Linux(例如,如果必须在两个函数之间进行选择,则必须在运行时或编译时自主做...

问题描述:

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


解决方案 1:

在两个平台上没有通用命令来清除控制台。

#include <cstdlib>

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

解决方案 2:

简短的回答是:你不能。

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

最难的答案:使用#ifdef _WIN32类似的东西让你的代码在不同的操作系统上有不同的表现。

解决方案 3:

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

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

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

解决方案 4:

一个简单的技巧:为什么不使用宏结合使用 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);
//....

解决方案 5:

简短回答

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

长答案,请阅读:

系统(“暂停”)说明

解决方案 6:

所提出的问题是无法回答的,因为它施加了不可能的限制。“清除屏幕”在不同的操作系统上是一个非常不同的操作,而如何执行该操作取决于操作系统。请参阅此常见问题答案,以完整解释如何在带有“控制台”的几个流行平台和带有“终端”的平台上执行此操作。您还会在同一位置找到一些要避免的常见错误的解释,其中一些 — 唉! — 已在上文中作为答案给出。

解决方案 7:

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

cout << "";

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

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 << "";
#endif
}

解决方案 8:

我知道这并没有回答我自己的问题,但是!这适用于 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);
}

解决方案 9:

其实,还有一种非常接近于清除屏幕的替代方法。您可以尝试使用重复新行的 for 循环。例如:

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




");
}

完成此循环后,终端将不允许您滚动回到顶部,这是一种不专业的做法,不符合常识。它不会直接回答您的问题,但它可以工作。

解决方案 10:

此代码清除 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__ */

解决方案 11:

正如其他人已经说过的,不可能有一段相同的代码可以清除 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 << "[1; 1H";
#endif
}

您可以按照上面显示的模式,以任何您喜欢的方式更改这两个代码段。

解决方案 12:

不会

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

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

解决方案 13:

如果你在控制台上工作,这应该有效

#include <conio.h>

int main()

{
    clrscr();
}
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用