在读取文件时检测EndOfFile IoResult

时间:2015-01-21 13:47:06

标签: io rust

我试图从Rust中的文件中读取。我不明白的是:当BufferedReader在EOF时,它实际上是Err(IoError {kind: EndOfFile})而我不知道如何匹配它。

loop {
  match file.read_line() {
    Ok(line) => {
      // Do stuff
    },
    // Err(EndOfFile) => is want I want here so I can call "break"
    Err(_) => {
      panic!("Unexpected error reading file.");
    }
  }
}

如何明确匹配EndOfFile枚举变体?

4 个答案:

答案 0 :(得分:6)

  

如何显式匹配EndOfFile枚举变体?

您可以使用以下模式匹配它而无需额外的嵌套匹配:

loop {
  match file.read_line() {
    Ok(line) => {
      // Do stuff
    },
    Err(IoError { kind: EndOfFile, .. }) =>
      break,
    Err(_) => {
      panic!("Unexpected error reading file.");
    }
  }
}

答案 1 :(得分:3)

专门用于遍历行生锈具有Buffers(http://doc.rust-lang.org/std/io/trait.BufferPrelude.html#tymethod.lines)的lines函数。

在你的情况下,你会循环上线,一旦达到EOF,循环就会自动中止而不需要你的干预。

for line in file.lines() {
    match line {
        Ok(line) => {
            // do stuff
        },
        Err(_) => {
            println!("Unexpected error reading file.")
        }
    }
}

或者,如果您的函数返回兼容的Result,您可以使用try!减少噪音的宏:

fn myfun(file: File) -> IoResult<()> {
    for line in file.lines() {
        let line = try!(line);
        // do stuff
    }
}

答案 2 :(得分:1)

看起来生锈帖子1.0已将IoError更改为std::io::Error。此外,kind现在隐藏在内部。我必须使用guard来处理类似的类型问题(WouldBlock而不是EndOfFile)。

e.g。

match some_method_that_might_block() {
    Ok(_) => {
        debug!("worked!");
    },
    Err(ref e @ IoError { kind: std::io::ErrorKind::WouldBlock, .. }) if e.kind() == std::io::ErrorKind::WouldBlock => {
        // ignore WouldBlock
    },
    Err(e) => { debug!("error={:?}", e); }
};

答案 3 :(得分:0)

对于在现代版本的rust post 1.0上进行阅读的任何人,the docs现在都规定,尝试从文件中读取文件时到达文件末尾肯定不是错误,应该用Ok(0)(很像其他编程语言/框架)表示,而不是硬错误。

由于您可以直接根据读取的字节数进行匹配(与std::io::error成员处于隐藏状态且无法直接进行匹配的ErrorKind不同),这使得处理起来非常容易:

        let mut buf: Vec<u8> = Vec::new();
        loop {
            let bytes_read = match file.read(&mut buf) {
                Ok(0) => break, // end-of-file
                Ok(n) => n,
                Err(e) => // handle error however you see fit,
            };