我正在尝试创建一个函数来返回字符串在文件中的位置。这是我的代码:
use std::{
fs::File,
io::{BufRead, BufReader, Seek, SeekFrom},
};
fn find(log_file: &str, key: &str) -> Option<u64> {
let log = File::open(log_file).unwrap();
let mut reader = BufReader::new(log);
for line in reader.lines() {
let line = line.unwrap();
if line.starts_with(&format!("{},", key)) {
let bytes = line.as_bytes();
let current_offset = reader.seek(SeekFrom::Current(0)).unwrap();
return Some(current_offset - bytes.len() as u64);
}
}
None
}
当我尝试编译时,我得到:
error[E0382]: use of moved value: `reader`
--> src/main.rs:13:34
|
9 | for line in reader.lines() {
| ------ value moved here
...
13 | let current_offset = reader.seek(SeekFrom::Current(0)).unwrap();
| ^^^^^^ value used here after move
|
= note: move occurs because `reader` has type `std::io::BufReader<std::fs::File>`, which does not implement the `Copy` trait
我有什么办法可以让它工作吗?
这个问题不是 Cannot use moved BufReader after for loop with bufreader.lines() 的重复问题因为使用 by_ref
也不起作用,因为编译器告诉我 reader 被可变地借用了两次。
最佳答案
我认为你应该在这里使用 .read_line()
。这比调用 .lines()
use std::{
fs::File,
io::{BufRead, BufReader},
};
fn find(log_file: &str, key: &str) -> Option<u64> {
let log = File::open(log_file).unwrap();
let mut reader = BufReader::new(log);
let mut line = String::new();
let mut pos = 0;
while let Ok(num) = reader.read_line(&mut line) {
if num == 0 {
break;
}
if line.starts_with(&format!("{},", key)) {
return Some(pos);
}
pos += num as u64;
line.clear();
}
None
}
关于rust - 无法在文件中找到字符串的位置,因为在移动后使用了 BufReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51249257/