下面的代码可以复现
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 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); } } ``` |
2
guonaihong OP @PeterD 谢谢回答,对于二进制文件,也想每次取一行,如何做呢?
|
3
gfreezy 2019-11-06 12:51:28 +08:00 via iPhone 1
二进制文件理论上没有行的概念。
好像有个库提供了 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 可以满足我的需求。
|