我正在努力学习 Rust。我正在关注一本实现 unix 程序的在线书籍cat。现在我试图读取作为参数传递的文件的内容,cargo run file1.txt file2.txt但是程序出现了恐慌:
D:\rust\cat> cargo run .\src\test.txt
Compiling cat v0.1.0 (D:\rust\cat)
Finished dev [unoptimized + debuginfo] target(s) in 0.62s
Running `target\debug\cat.exe .\src\test.txt`
thread 'main' panicked at 'Box<Any>', src\main.rs:12:28
Run Code Online (Sandbox Code Playgroud)
这是我的程序:
use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
match read_file(&args) {
Ok(content) => println!("{}", content),
Err(reason) => panic!(reason),
}
}
}
fn read_file(filenames: &Vec<String>) -> Result<String, io::Error> {
let mut content = String::new();
for filename in filenames {
let mut file = File::open(filename)?;
file.read_to_string(&mut content)?;
}
Ok(content)
}
Run Code Online (Sandbox Code Playgroud)
谁能解释一下我在这里缺少什么?
Args返回的迭代器的第一个元素std::env::args通常是可执行文件的路径(
有关更多详细信息,请参阅文档)。
出现错误的原因是您没有跳过第一个参数:程序二进制文件不是有效的 UTF-8 字节序列。
明显无意义的错误thread 'main' panicked at 'Box<Any>'是因为panic!没有与format!语法的相同参数一起使用。
use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;
fn main() {
for filename in env::args().skip(1) {
match read_file(filename) {
Ok(content) => println!("{}", content),
Err(reason) => panic!("{}", reason),
}
}
}
fn read_file(filename: String) -> Result<String, io::Error> {
let mut content = String::new();
let mut file = File::open(filename)?;
file.read_to_string(&mut content)?;
Ok(content)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2402 次 |
| 最近记录: |