输出字符串用 C++ 覆盖 Linux 终端上的最后一个字符串
output string overwrite last string on terminal in Linux with c++
假设我有一个命令行程序。有没有办法让我说
std::cout << stuff
如果我不在另一个 std::cout << stuff
之间执行 std::cout << '\n'
,另一个输出的东西会覆盖同一行上的最后一个东西(清理行)从最左边的列开始?
我觉得ncurses有这个能力吗?如果可以的话,我要是能说std::cout << std::overwrite << stuff
就好了
其中 std::overwrite
是某种 iomanip。
你试过马车returns\r
吗?这应该可以满足您的要求。
转义字符文档也值得一看:http://en.wikipedia.org/wiki/ANSI_escape_code
您可以做的不仅仅是将插入符号设置回行首位置!
你试过std::istream::sentry
了吗?您可以尝试以下操作,这将 "audit" 您的输入。
std::istream& operator>>(std::istream& is, std::string& input) {
std::istream::sentry s(is);
if(s) {
// use a temporary string to append the characters to so that
// if a `\n` isn't in the input the string is not read
std::string tmp;
while(is.good()) {
char c = is.get();
if(c == '\n') {
is.getloc();
// if a '\n' is found the data is appended to the string
input += tmp;
break;
} else {
is.getloc();
tmp += c;
}
}
}
return(is);
}
关键部分是我们将输入到流的字符附加到一个临时变量,如果未读取 '\n',数据将被丢弃。
用法:
int main() {
std::stringstream bad("this has no return");
std::string test;
bad >> test;
std::cout << test << std::endl; // will not output data
std::stringstream good("this does have a return\n");
good >> test;
std::cout << test << std::endl;
}
这不会像 iomanip
那样简单,但我希望它能有所帮助。
如果你只是想覆盖最后打印的内容而同一行的其他内容保持不变,那么你可以这样做:
#include <iostream>
#include <string>
std::string OverWrite(int x) {
std::string s="";
for(int i=0;i<x;i++){s+="\b \b";}
return s;}
int main(){
std::cout<<"Lot's of ";
std::cout<<"stuff"<<OverWrite(5)<<"new_stuff"; //5 is the length of "stuff"
return(0);
}
输出:
Lot's of new_stuff
OverWrite() 函数清除前面的 "stuff" 并将光标放在它的开头。
If you want the whole line to be cleaned and print new_stuff in that
place then just make the argument of OverWrite()
big enough like
OverWrite(100)
or something like that to clean the whole line
altogether.
如果您不想清洁任何东西,只需从头开始更换,然后您可以简单地这样做:
#include<iostream>
#define overwrite "\r"
int main(){
std::cout<<"stuff"<<overwrite<<"new_stuff";
return(0);
}
假设我有一个命令行程序。有没有办法让我说
std::cout << stuff
如果我不在另一个 std::cout << stuff
之间执行 std::cout << '\n'
,另一个输出的东西会覆盖同一行上的最后一个东西(清理行)从最左边的列开始?
我觉得ncurses有这个能力吗?如果可以的话,我要是能说std::cout << std::overwrite << stuff
其中 std::overwrite
是某种 iomanip。
你试过马车returns\r
吗?这应该可以满足您的要求。
转义字符文档也值得一看:http://en.wikipedia.org/wiki/ANSI_escape_code
您可以做的不仅仅是将插入符号设置回行首位置!
你试过std::istream::sentry
了吗?您可以尝试以下操作,这将 "audit" 您的输入。
std::istream& operator>>(std::istream& is, std::string& input) {
std::istream::sentry s(is);
if(s) {
// use a temporary string to append the characters to so that
// if a `\n` isn't in the input the string is not read
std::string tmp;
while(is.good()) {
char c = is.get();
if(c == '\n') {
is.getloc();
// if a '\n' is found the data is appended to the string
input += tmp;
break;
} else {
is.getloc();
tmp += c;
}
}
}
return(is);
}
关键部分是我们将输入到流的字符附加到一个临时变量,如果未读取 '\n',数据将被丢弃。
用法:
int main() {
std::stringstream bad("this has no return");
std::string test;
bad >> test;
std::cout << test << std::endl; // will not output data
std::stringstream good("this does have a return\n");
good >> test;
std::cout << test << std::endl;
}
这不会像 iomanip
那样简单,但我希望它能有所帮助。
如果你只是想覆盖最后打印的内容而同一行的其他内容保持不变,那么你可以这样做:
#include <iostream>
#include <string>
std::string OverWrite(int x) {
std::string s="";
for(int i=0;i<x;i++){s+="\b \b";}
return s;}
int main(){
std::cout<<"Lot's of ";
std::cout<<"stuff"<<OverWrite(5)<<"new_stuff"; //5 is the length of "stuff"
return(0);
}
输出:
Lot's of new_stuff
OverWrite() 函数清除前面的 "stuff" 并将光标放在它的开头。
If you want the whole line to be cleaned and print new_stuff in that place then just make the argument of
OverWrite()
big enough likeOverWrite(100)
or something like that to clean the whole line altogether.
如果您不想清洁任何东西,只需从头开始更换,然后您可以简单地这样做:
#include<iostream>
#define overwrite "\r"
int main(){
std::cout<<"stuff"<<overwrite<<"new_stuff";
return(0);
}