Rust-从方法中获取值,无需借用(计算文件的行数)

Rust-从方法中获取值,无需借用(计算文件的行数),rust,io,borrowing,Rust,Io,Borrowing,我是个新手,不知道如何解决这个问题。 代码是: let input = File::open(file_path)?; let buffered = BufReader::new(input); let line_count = buffered.lines().count(); for (nr, line) in buffered.lines().enumerate() { print!("\rLOADED: [{}/{}]", nr, line_count)

我是个新手,不知道如何解决这个问题。 代码是:

let input = File::open(file_path)?;
let buffered = BufReader::new(input);

let line_count = buffered.lines().count();

 for (nr, line) in buffered.lines().enumerate() {
    print!("\rLOADED: [{}/{}]", nr, line_count);
    // do something...
}
我得到的错误是:

let buffered = BufReader::new(input);
    -------- move occurs because `buffered` has type `std::io::BufReader<std::fs::File>`, which does not implement the `Copy` trait

let line_count = buffered.lines().count();
                 -------- value moved here
  
for (nr, line) in buffered.lines().enumerate() {
                  ^^^^^^^^ value used here after move
let buffered=BufReader::new(输入);
--------发生移动是因为'buffered'的类型为'std::io::BufReader',而该类型未实现'Copy'特性
让line_count=缓冲的.line().count();
--------价值转移到这里
对于缓冲.lines()中的(nr,line)。枚举(){
^^^^^^^^移动后此处使用的值

请帮帮我,我被困在这个问题上。

调用
BufReader::new(file\u handle);
会消耗
file\u handle
并调用
buffered.lines()
使用
缓冲区
。可能有一种更有效、更聪明或更优雅的方法来实现这一点,但如果您想首先获得完整的行数,可以打开并迭代文件两次:

使用std::fs::File;
使用std::io::{self,BufRead,BufReader};
fn main()->io::Result{
让文件_path=“input.txt”;
让输入=文件::打开(文件路径)?;
让buffered=BufReader::new(输入);
让line_count=缓冲的.line().count();
让输入=文件::打开(文件路径)?;
让buffered=BufReader::new(输入);
对于缓冲.lines()中的(nr,line)。枚举(){
println!(“加载:[{}/{}]”,nr,行数);
}
好(())
}

调用
BufReader::new(file_handle);
会消耗
文件_handle
而调用
buffered.lines()
会消耗
buffered
。可能有一种更高效、更聪明或更优雅的方法来实现这一点,但如果您想首先获得完整的行数,可以打开并在文件上迭代两次:

使用std::fs::File;
使用std::io::{self,BufRead,BufReader};
fn main()->io::Result{
让文件_path=“input.txt”;
让输入=文件::打开(文件路径)?;
让buffered=BufReader::new(输入);
让line_count=缓冲的.line().count();
让输入=文件::打开(文件路径)?;
让buffered=BufReader::new(输入);
对于缓冲.lines()中的(nr,line)。枚举(){
println!(“加载:[{}/{}]”,nr,行数);
}
好(())
}

谢谢你的回答!是的,我知道我可以像你写的那样打开并迭代文件两次,但是如果可能的话,我想避免使用这种方法。谢谢你的回答!是的,我知道我可以像你写的那样打开并迭代文件两次,但是如果可能的话,我想避免使用这种方法。