使用read_until()时,如何阻止BufReader在Rust中读取?

时间:2018-10-17 02:36:58

标签: io rust bufferedreader

我正在尝试使用BufReader加载一堆数据,然后使用read_until()扫描数据。但是,当read_until()达到EOF并且我的代码再次回到数据开头时,我很难辨别,从而创建了无限循环。当read_until()达到EOF时,我需要停止阅读。如何在Rust中完成此操作?

这是我到目前为止所拥有的:

use std::fs::File;
use std::io::BufRead;
use std::io::BufReader;
use std::str;

fn main() -> std::io::Result<()> {
    let f1 = File::open("foo.txt")?;
    let mut reader = BufReader::new(f1);
    let mut byte_vec: Vec<u8> = Vec::new();
    loop {
        let my_bytes = reader.read_until(b'\n', &mut byte_vec);
        let is_valid_utf8 = str::from_utf8(&byte_vec);

        match is_valid_utf8 {
            Ok(the_str) => println!("{} is a valid UTF-8 String", the_str),
            Err(err) => println!("Error: {}", err),
        }
    }
    Ok(())
}

foo.txt仅包含几行示例文本。该代码将永远循环回到文件的开头。

1 个答案:

答案 0 :(得分:1)

检查编译器给您的警告,这就是它们在那里的原因!

warning: unreachable expression
  --> src/lib.rs:16:5
   |
16 |     Ok(())
   |     ^^^^^^
   |
   = note: #[warn(unreachable_code)] on by default

warning: unused variable: `my_bytes`
 --> src/lib.rs:8:13
  |
8 |         let my_bytes = reader.read_until(b'\n', &mut byte_vec);
  |             ^^^^^^^^ help: consider using `_my_bytes` instead
  |
  = note: #[warn(unused_variables)] on by default

编译器告诉您

  1. 您的循环将永远不会退出-这就是您的无限循环。
  2. 您没有使用read_until的返回值。

这两件事是相关的。检查文档中的read_until,重点是我的

  

将所有字节读入buf,直到达到分隔符字节或EOF

     

[...]

     

如果成功,此函数将返回读取的字节总数

使用值:

let my_bytes = reader.read_until(b'\n', &mut byte_vec)?;
if my_bytes == 0 { break };

继续阅读文档,重点是我的

  

分隔符(包括分隔符)之前(包括找到)的所有字节将附加到buf

您的byte_vec将继续累积前一行。这就是为什么您认为BufReader返回到输入的开头的原因。您大概希望在每次循环迭代结束时clear

另请参阅: