
下面的代码可以复现
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。想问下除了自己手动造轮子有没有现成的方法???
1 PeterD 2019-11-06 09:46:41 +08:00 ```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); } } ``` |
2 guonaihong OP @PeterD 谢谢回答,对于二进制文件,也想每次取一行,如何做呢? |
3 gfreezy 2019-11-06 12:51:28 +08:00 via iPhone 二进制文件理论上没有行的概念。 好像有个库提供了 read_until 的方法。 |
4 PeterD 2019-11-06 12:55:04 +08:00 @guonaihong bytes 没有行的概念,如果你想要的是用 b'\n' 来分割“行”,你可以检查读出的 buf 里有没有 b'\n',然后在拼接。 |
5 guonaihong OP @PeterD ok。没有 std 方法,我先自己造个。谢谢了。。。 |
6 gfreezy 2019-11-06 13:25:12 +08:00 |
7 guonaihong OP @gfreezy 谢了,read_until 可以满足我的需求。 |