Io 使用read_until()时,如何阻止BufReader在Rust中读取?
我试图使用Io 使用read_until()时,如何阻止BufReader在Rust中读取?,io,rust,bufferedreader,Io,Rust,Bufferedreader,我试图使用BufReader加载一组数据,然后使用read_until()扫描数据。然而,我很难辨别何时read_until()点击EOF,我的代码又回到了数据的开头,创建了一个无限循环。当读取时,我需要停止读取,直到()点击EOF。我怎样才能做到这一点 这就是我到目前为止所做的: use std::fs::File; use std::io::BufRead; use std::io::BufReader; use std::str; fn main() -> std::io::Res
BufReader
加载一组数据,然后使用read_until()
扫描数据。然而,我很难辨别何时read_until()
点击EOF,我的代码又回到了数据的开头,创建了一个无限循环。当读取时,我需要停止读取,直到()
点击EOF。我怎样才能做到这一点
这就是我到目前为止所做的:
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(())
}
使用std::fs::File;
使用std::io::BufRead;
使用std::io::BufReader;
使用std::str;
fn main()->std::io::Result{
让f1=File::open(“foo.txt”)?;
让mut reader=BufReader::new(f1);
让mut byte_vec:vec=vec::new();
环路{
让my_bytes=reader.read_直到(b'\n',&mut byte_vec);
let is_valid_utf8=str::from_utf8(&byte_vec);
匹配项\u有效\u utf8{
Ok(the_str)=>println!(“{}是有效的UTF-8字符串”,the_str),
Err(Err)=>println!(“错误:{}”,Err),
}
}
好(())
}
txt只有几行示例文本。代码将永远循环回到文件的开头。检查编译器给您的警告,这就是它们出现的原因
警告:无法访问表达式
-->src/lib.rs:16:5
|
16 |好(())
| ^^^^^^
|
=注意:#[警告(无法访问的_代码)]默认打开
警告:未使用的变量:`my_字节`
-->src/lib.rs:8:13
|
8 |让my_bytes=reader.read_直到(b'\n',&mut byte_vec);
帮助:考虑使用'yyMyByth'代替
|
=注意:#[警告(未使用的_变量)]默认打开
编译器告诉你
read\u的返回值
let my_bytes = reader.read_until(b'\n', &mut byte_vec)?;
if my_bytes == 0 { break };
继续阅读文档,重点是我的: 分隔符(如果找到)之前(包括)的所有字节将追加到
buf
您的byte_vec
将继续累加前一行。这就是为什么您认为BufReader
正在返回到输入的开头。您可能希望在每个循环迭代结束时使用它
另见:
之后,这个函数将从底层流中读取字节,直到找到换行符(0xA字节)或EOF为止。一旦找到,所有包含分隔符(如果找到)的字节都将附加到buf。
这意味着我必须扫描每个输入组以查找EOF?因此,必须有一个更有效的解决办法。在询问之前,我确实读过,顺便说一句,EOF
不是一个值。这是一个州。在缓冲区中搜索它是没有意义的,它不作为值存在。谢谢谢普,但我有一个问题-如果EOF在一行的末尾怎么办?读取的字节数将超过0。这就是我的困惑所在。有意义吗?@恩典那很好,这取决于你想做什么。如果字符串必须以换行符结尾,则必须以某种方式进行检查,例如确保读取的最后一个字节是换行符(If byte_vec.last()!=Some(&b'\n'){continue}
是一种简单的方法)。大多数情况下,您希望将EOF视为一条新线,然后您不必做任何事情。