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的返回值
  • 这两件事是相关的。检查文档,重点是我的:

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

    [……]

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

    使用以下值:

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

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

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

    您的
    byte_vec
    将继续累加前一行。这就是为什么您认为
    BufReader
    正在返回到输入的开头。您可能希望在每个循环迭代结束时使用它

    另见:


    1。为什么不使用读线?2.阅读文档3。阅读警告1。因为read_line()假设数据可以被解析为utf8,而我在代码中不能这样假设。2.一个特定的文档领域将是有用的,而不仅仅是“阅读文档”-这和我的问题一样毫无用处,你显然在呼唤。理论上,每个SO问题都可以用“阅读文档”来回答。来吧,伙计。@Stargateur right,在看到
    之后,这个函数将从底层流中读取字节,直到找到换行符(0xA字节)或EOF为止。一旦找到,所有包含分隔符(如果找到)的字节都将附加到buf。
    这意味着我必须扫描每个输入组以查找EOF?因此,必须有一个更有效的解决办法。在询问之前,我确实读过,顺便说一句,
    EOF
    不是一个值。这是一个州。在缓冲区中搜索它是没有意义的,它不作为值存在。谢谢谢普,但我有一个问题-如果EOF在一行的末尾怎么办?读取的字节数将超过0。这就是我的困惑所在。有意义吗?@恩典那很好,这取决于你想做什么。如果字符串必须以换行符结尾,则必须以某种方式进行检查,例如确保读取的最后一个字节是换行符(
    If byte_vec.last()!=Some(&b'\n'){continue}
    是一种简单的方法)。大多数情况下,您希望将EOF视为一条新线,然后您不必做任何事情。