我试图打印正在进行的过程中的状态,如下所示:
|Label-1 |Label-2 |Label-3
|Data-1 |Data-2 |Data-3
|Data-1 |Data-2 |Data-3
|Data-1 |Data-2 |Data-3有以下代码:
println!("|{0:<25} | {1:<1} | {2:<10}", "URL Path", "Status Code", "Version");
println!("{0:<25} | {1:<11} | {2:<10?}", resp.request_url, resp.status_code, resp.version);
unsafe {
if (FOUND.len() != 0) {
for elem in FOUND.iter() {
println!("\n\n{0:<25} | {1:<11} | {2:<10?}", elem.request_url, elem.status_code, elem.version);
}
}
if (resp.status_code == 200) {
FOUND.push(resp)
}
}
stdout().execute(cursor::MoveUp(3));
stdout().execute(terminal::Clear(terminal::ClearType::FromCursorDown));行的字符串必须用新字符串覆盖。如果它是一行,我可以执行print!("\r{} | {} | {}",data1,data2,data3),但是由于它是多行的,所以回车会造成混乱。
PS:任何例子都将不胜感激。
发布于 2022-06-02 15:27:57
我不知道你到底有什么问题,但是持有一个锁着的stdout对我来说是有效的:
use std::io::{stdout, Write};
use crossterm::{
cursor, terminal, Result, ExecutableCommand
};
fn main() -> Result<()> {
let mut stdout = stdout(); // lock stdout and use the same locked instance throughout
writeln!(stdout, "|{0:<25} | {1:<11} | {2:<10}", "URL Path", "Status Code", "Version")?;
writeln!(stdout, "|{0:<25} | {1:<11} | {2:<10}", "https://google.com", 200, 9)?;
writeln!(stdout, "|{0:<25} | {1:<11} | {2:<10}", "https://yahoo.com", 200, 15)?;
// wait 2 seconds before replacing lines
std::thread::sleep(std::time::Duration::from_secs(2));
stdout.execute(cursor::MoveUp(2))?;
stdout.execute(terminal::Clear(terminal::ClearType::FromCursorDown))?;
writeln!(stdout, "|{0:<25} | {1:<11} | {2:<10}", "https://bing.com", 200, 3)?;
writeln!(stdout, "|{0:<25} | {1:<11} | {2:<10}", "https://duckduckgo.com", 200, 1)?;
Ok(())
}https://stackoverflow.com/questions/72416445
复制相似问题