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

标签 rust

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

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/

相关文章:

rust - 如何在包装箱安装中包括文本文件

azure - 如何在 Azure 中为 MSAL2 (TenantId) 配置 rust oauth2

generics - 将泛型参数与 impl 的另一个泛型参数匹配

rust - 为什么在.map 中执行的闭包不会改变捕获的值?

generics - 我可以使这个结构更通用吗?

rust - 如何将 u64 值转换为通用数字类型?

rust - 展开时无法移出共享引用后面的值

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 为什么从 `&' a [u8 ]` to ` &'a mut [u8]` 更改字段会导致生命周期错误?

random - 如何使用字符串或数字在 Rust 中为随机数生成器提供种子