gpt4 book ai didi

rust - 无法在文件中找到字符串的位置,因为在移动后使用了 BufReader

转载 作者:行者123 更新时间:2023-11-29 08:29:31 25 4
gpt4 key购买 nike

我正在尝试创建一个函数来返回字符串在文件中的位置。这是我的代码:

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
}

playground

当我尝试编译时,我得到:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com