我正在尝试使用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仅包含几行示例文本。该代码将永远循环回到文件的开头。
答案 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
编译器告诉您
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
。
另请参阅: