我知道如何阅读命令行参数,但是我在从管道读取命令输出时遇到了困难。
使用管道连接将数据输出到Rust程序的程序(A):
A | R
程序应该逐行消耗数据。
$ pwd | cargo run
应打印pwd
输出。
OR
$ find . | cargo run
应该输出超过1行的find
命令输出。
答案 0 :(得分:5)
在BufRead::lines
上使用locked handle to standard input:
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
for line in stdin.lock().lines() {
let line = line.expect("Could not read line from standard in");
println!("{}", line);
}
}
如果您想重用String
的分配,可以使用循环形式:
use std::io::{self, Read};
fn main() {
let stdin = io::stdin();
let mut stdin = stdin.lock(); // locking is optional
let mut line = String::new();
// Could also `match` on the `Result` if you wanted to handle `Err`
while let Ok(n_bytes) = stdin.read_to_string(&mut line) {
if n_bytes == 0 { break }
println!("{}", line);
line.clear();
}
}
答案 1 :(得分:3)
您只需阅读 public class CSVItem
{
public string SerialNumber { get; set; }
public double Input1 { get; set; }
public double Input2 { get; set; }
public double Input3 { get; set; }
public double Input4 { get; set; }
public double Input5 { get; set; }
public double Input6 { get; set; }
public string Input7 { get; set; }
public double Input8 { get; set; }
}
。
这是基于the documentation:
的示例Stdin
主要是文档示例包含在循环中,当没有更多输入时突然退出循环,或者是否有错误。
其他更改是在您的上下文中将错误写入use std::io;
fn main() {
loop {
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(len) => if len == 0 {
return;
} else {
println!("{}", input);
}
Err(error) => {
eprintln!("error: {}", error);
return;
}
}
}
}
会更好,这就是错误分支使用stderr
而不是eprintln!
的原因。在撰写该文档时,该宏可能无法使用。
答案 2 :(得分:0)
!===
<强>输出:强>
use std::io;
fn main() {
loop {
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("failed to read from pipe");
input = input.trim().to_string();
if input == "" {
break;
}
println!("Pipe output: {}", input);
}
}