下面的代码可以复现
use std::fs::File;
use std::io::{self, prelude::*, BufReader};
fn main() -> io::Result<()> {
    let file = File::open("./target/debug/foo")?;
    let reader = BufReader::new(file);
    for line in reader.lines() {
        println!("{}", line?);
    }
    Ok(())
}
//输出
//Error: Custom { kind: InvalidData, error: StringError("stream did not contain valid UTF-8") }
不使用官方库的函数,实现一个类似 reader.lines 的方法,不过返回 bytes。想问下除了自己手动造轮子有没有现成的方法???
|  |      1PeterD      2019-11-06 09:46:41 +08:00  1 ```rust #[stable(feature = "rust1", since = "1.0.0")] impl<B: BufRead> Iterator for Lines<B> { type Item = Result<String>; ``` Lines 用的是 String,不是 [u8] 要读 [u8] 要用 mut [u8; N] ```rust use std::{fs, io, io::Read}; pub fn main() { let path = "abc"; let f = fs::File::open(path).unwrap(); let mut buf: [u8; 10] = Default::default(); let mut r = io::BufReader::new(f); r.read(&mut buf).unwrap(); for i in &buf { println!("{}", i); } } ``` | 
|  |      2guonaihong OP @PeterD 谢谢回答,对于二进制文件,也想每次取一行,如何做呢? | 
|  |      3gfreezy      2019-11-06 12:51:28 +08:00 via iPhone  1 二进制文件理论上没有行的概念。 好像有个库提供了 read_until 的方法。 | 
|  |      4PeterD      2019-11-06 12:55:04 +08:00 @guonaihong  bytes 没有行的概念,如果你想要的是用 b'\n' 来分割“行”,你可以检查读出的 buf 里有没有 b'\n',然后在拼接。 | 
|  |      5guonaihong OP @PeterD ok。没有 std 方法,我先自己造个。谢谢了。。。 | 
|  |      6gfreezy      2019-11-06 13:25:12 +08:00 | 
|  |      7guonaihong OP @gfreezy 谢了,read_until 可以满足我的需求。 |