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