读取文件时检测 EndOfFile IoResult
Detect EndOfFile IoResult when reading a file
我正在尝试从 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
枚举变体?
专门用于遍历行生锈具有缓冲区的lines
功能(http://doc.rust-lang.org/std/io/trait.BufferPrelude.html#tymethod.lines)。
在您的情况下,您将遍历所有行,一旦到达 EOF,循环将自动中止,无需您的干预。
for line in file.lines() {
match line {
Ok(line) => {
// do stuff
},
Err(_) => {
println!("Unexpected error reading file.")
}
}
}
或者,如果你的函数returns兼容Result
你可以试试!减少噪音的宏:
fn myfun(file: File) -> IoResult<()> {
for line in file.lines() {
let line = try!(line);
// do stuff
}
}
How can I explicitly match the EndOfFile enum variant?
您可以使用以下模式匹配它而无需额外的嵌套匹配:
loop {
match file.read_line() {
Ok(line) => {
// Do stuff
},
Err(IoError { kind: EndOfFile, .. }) =>
break,
Err(_) => {
panic!("Unexpected error reading file.");
}
}
}
看起来像 rust post 1.0 已将 IoError
更改为 std::io::Error
。此外,kind
现在隐藏在内部结构中。我不得不使用 guard 来处理类似类型的问题(WouldBlock
而不是 EndOfFile
)。
例如
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); }
};
对于在现代版本的 rust post 1.0 上阅读本文的任何人,the docs 现在规定在尝试读取文件时到达文件末尾绝对 不是 一个错误,应该用 Ok(0)
(很像其他编程 languages/frameworks)而不是硬错误来表示。
因为您可以直接匹配读取的字节数(不像 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,
};
我正在尝试从 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
枚举变体?
专门用于遍历行生锈具有缓冲区的lines
功能(http://doc.rust-lang.org/std/io/trait.BufferPrelude.html#tymethod.lines)。
在您的情况下,您将遍历所有行,一旦到达 EOF,循环将自动中止,无需您的干预。
for line in file.lines() {
match line {
Ok(line) => {
// do stuff
},
Err(_) => {
println!("Unexpected error reading file.")
}
}
}
或者,如果你的函数returns兼容Result
你可以试试!减少噪音的宏:
fn myfun(file: File) -> IoResult<()> {
for line in file.lines() {
let line = try!(line);
// do stuff
}
}
How can I explicitly match the EndOfFile enum variant?
您可以使用以下模式匹配它而无需额外的嵌套匹配:
loop {
match file.read_line() {
Ok(line) => {
// Do stuff
},
Err(IoError { kind: EndOfFile, .. }) =>
break,
Err(_) => {
panic!("Unexpected error reading file.");
}
}
}
看起来像 rust post 1.0 已将 IoError
更改为 std::io::Error
。此外,kind
现在隐藏在内部结构中。我不得不使用 guard 来处理类似类型的问题(WouldBlock
而不是 EndOfFile
)。
例如
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); }
};
对于在现代版本的 rust post 1.0 上阅读本文的任何人,the docs 现在规定在尝试读取文件时到达文件末尾绝对 不是 一个错误,应该用 Ok(0)
(很像其他编程 languages/frameworks)而不是硬错误来表示。
因为您可以直接匹配读取的字节数(不像 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,
};