C++ 如何删除已在终端上以c++;?

C++ 如何删除已在终端上以c++;?,c++,C++,我目前正在为一个项目制作一个自助订单付款程序,我试图找出一种方法来删除前一行文本,使其看起来更干净。我发现有一个类似于系统(“CLS”)的功能但它不会擦除控制台中的所有文本,而是只擦除文本的某些部分 我已经编写了大约一两周的代码,所以如果我遗漏了什么,请告诉我 switch(buy){ case '1': //random code break; default: cout << "sorry t

我目前正在为一个项目制作一个自助订单付款程序,我试图找出一种方法来删除前一行文本,使其看起来更干净。我发现有一个类似于
系统(“CLS”)的功能
但它不会擦除控制台中的所有文本,而是只擦除文本的某些部分

我已经编写了大约一两周的代码,所以如果我遗漏了什么,请告诉我

switch(buy){

    case '1':
        //random code
        break;

     default:
            cout << "sorry thats not a valid number ;w;\n\n"; //remove this text after system("pause")
            system("pause");
            system("CLS"); //I need this to remove only one line instead of the whole thing.
        
            break;
}
    
        
开关(购买){
案例“1”:
//随机码
打破
违约:

cout您需要声明一个变量,然后使用if条件

我不知道C++,但我在这里给出提示。< /P>
bool systempaused=false;
后来

if(!systempaused)
{

//print your line

}

system("pause")

您需要声明一个变量,然后使用if条件

我不知道C++,但我在这里给出提示。< /P>
bool systempaused=false;
后来

if(!systempaused)
{

//print your line

}

system("pause")
你可以做:-

cout<<"\r      lots of spaces                  "<<endl;
cout您可以执行以下操作:-

cout<<"\r      lots of spaces                  "<<endl;

<代码> CUT

我知道,对于您的任务没有标准的C++解决方案,下面将介绍平台依赖的方式。 完成任务所需的主要工作是将光标向上移动一行。之后,您可以只打印空格以清除行(并通过

\r
将光标移动到行的开头)

我提供了解决任务的两种变体(变体1变体2


变体1。使用ANSI转义码(Windows/Linux/MacOS)

有一些所谓的方法允许您对控制台进行丰富的操作,包括您的任务(将光标向上移动一行)

通过此转义码,可以通过将字符串
“\x1b[1A”
打印到控制台来实现向上移动队列(例如,要向上移动23个队列,您可以打印
”\x1b[23A”
,请参见此字符串内的23)。此外,您还可以通过
“\x1b[23C”
(向右移动23个位置)来实现向右移动光标

默认情况下,Linux/MacOS和其他POSIX系统通常支持ANSI转义码(不同的终端实现可能支持,也可能不支持)。Windows也支持ANSI转义码,但默认情况下不启用,需要通过特殊的WinAPI函数启用

ClearLines()
函数中不要忘记调整
width
参数,它现在被设置为
40
,它表示控制台的宽度,确切地说,它只清除带有空格的行的第一个
width
字符

下一个代码执行Windows和Unix系统所需的操作。Windows特定代码位于
\ifdef
\endif
之间

#包括
#包括
#ifdef_WIN32
#包括
内联布尔WinAnsiConsoleEnable(int stdout\u或\u stderr=0){
if(!SetConsoleOutputCP(65001))//如果需要,启用UTF-8控制台。
返回false;
#ifndef启用虚拟终端处理
#定义启用虚拟终端处理0x0004
#恩迪夫
DWORD输出模式=0;
句柄stdoutHandle=GetStdHandle(stdout\u或stderr==0?
STD_输出_句柄:stdout_或_stderr==1?STD_错误_句柄:0);
if(stdoutHandle==无效的句柄值)
返回false;
如果(!GetConsoleMode(stdoutHandle和outMode))
返回false;
//启用ANSI转义码
outMode |=启用虚拟终端处理;
如果(!SetConsoleMode(stdoutHandle,outMode))
返回false;
返回true;
}
#endif/\u WIN32
静态空白清除线(大小cnt,大小宽度=40){//清除cnt最后一行。

STD::CUT

我知道没有标准的C++解决方案,下面将介绍平台依赖的方式。 完成任务所需的主要工作是将光标向上移动一行。之后,您可以只打印空格以清除行(并通过

\r
将光标移动到行的开头)

我提供了解决任务的两种变体(变体1变体2


变体1。使用ANSI转义码(Windows/Linux/MacOS)

有一些所谓的方法允许您对控制台进行丰富的操作,包括您的任务(将光标向上移动一行)

通过此转义码,可以通过将字符串
“\x1b[1A”
打印到控制台来实现向上移动队列(例如,要向上移动23个队列,您可以打印
”\x1b[23A”
,请参见此字符串内的23)。此外,您还可以通过
“\x1b[23C”
(向右移动23个位置)来实现向右移动光标

默认情况下,Linux/MacOS和其他POSIX系统通常支持ANSI转义码(不同的终端实现可能支持,也可能不支持)。Windows也支持ANSI转义码,但默认情况下不启用,需要通过特殊的WinAPI函数启用

ClearLines()
函数中不要忘记调整
width
参数,它现在被设置为
40
,它表示控制台的宽度,确切地说,它只清除带有空格的行的第一个
width
字符

下一个代码执行Windows和Unix系统所需的操作。Windows特定代码位于
\ifdef
\endif
之间

#包括
#包括
#ifdef_WIN32
#包括
内联布尔WinAnsiConsoleEnable(int stdout\u或\u stderr=0){
if(!SetConsoleOutputCP(65001))//如果需要,启用UTF-8控制台。
返回false;
#ifndef启用虚拟终端处理
#定义启用虚拟终端处理0x0004
#恩迪夫
DWORD输出模式=0;
句柄stdoutHandle=GetStdHandle(stdout\u或stderr==0?
STD_输出_句柄:stdout_或_stderr==1?STD_错误_句柄:0);
if(stdoutHandle==无效的句柄值)
返回false;
如果(!GetConsoleMode(stdoutHandle和outMode))
返回false;
//启用ANSI转义码
outMode |=启用虚拟终端处理;
如果(!SetConsoleMode(stdoutHandle,outMode))
返回false;
返回
#include <chrono>   // misc. clocks    
#include <iostream>
#include <string>
#include <thread>   // std::this_thread::sleep_for

// a function to print some text, sleep for awhile and then remove the text
void print_and_clear(const std::string& txt, std::chrono::nanoseconds sleep) {
    std::cout << txt << std::flush;      // print the text

    std::this_thread::sleep_for(sleep);  // sleep for awhile

    // Remove the text by returning to the beginning of the line and
    // print a number of space characters equal to the length of the
    // text and then return to the beginning of the line again.
    std::cout << '\r' << std::string(txt.size(), ' ') << '\r' << std::flush;
}

int main() {
    print_and_clear("sorry thats not a valid number...", std::chrono::seconds(1));
    std::cout << "Hello\n";
}