读取行

方法 lines() 在文件的行上返回一个迭代器。

File::open 需要一个泛型 AsRef<Path>。这正是 read_lines() 期望的输入。

  1. use std::fs::File;
  2. use std::io::{self, BufRead};
  3. use std::path::Path;
  4. fn main() {
  5. // 在生成输出之前,文件主机必须存在于当前路径中
  6. if let Ok(lines) = read_lines("./hosts") {
  7. // 使用迭代器,返回一个(可选)字符串
  8. for line in lines {
  9. if let Ok(ip) = line {
  10. println!("{}", ip);
  11. }
  12. }
  13. }
  14. }
  15. // 输出包裹在 Result 中以允许匹配错误,
  16. // 将迭代器返回给文件行的读取器(Reader)。
  17. fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
  18. where P: AsRef<Path>, {
  19. let file = File::open(filename)?;
  20. Ok(io::BufReader::new(file).lines())
  21. }

运行此程序将一行行将内容打印出来。

  1. $ echo -e "127.0.0.1\n192.168.0.1\n" > hosts
  2. $ rustc read_lines.rs && ./read_lines
  3. 127.0.0.1
  4. 192.168.0.1

这个过程比在内存中创建 String 更有效,特别是处理更大的文件。