pub struct Eof<R: Read> { /* private fields */ }
Expand description
Track whether a stream has hit the end of file.
This allows slightly nicer code when reading lots of items using an uncooperative api,
or when you want an UnexpectedEof
only after the first byte.
It also simplifies determining the last chunk when processing
input in fixed-size chunks.
Eof::eof()
and – for consistency – the Read
implementation of Eof
ignore ErrorKind::Interrupted
errors and retry the operation.
§Example
use std::io;
use std::io::Read;
use std::fs::File;
use iowrap::Eof;
fn load() -> io::Result<Vec<u64>> {
let mut ret = Vec::new();
let mut file = Eof::new(File::open("foo.bin")?);
while !file.eof()? {
ret.push(third_party::parse_thing(&mut file));
}
Ok(ret)
}
mod third_party {
use std::io::Read;
pub fn parse_thing<R: Read>(mut from: R) -> u64 {
let mut buf = [0u8; 8];
from.read_exact(&mut buf).unwrap();
u64::from(buf[0]) // oops!
}
}
Implementations§
source§impl<R: Read> Eof<R>
impl<R: Read> Eof<R>
pub fn new(inner: R) -> Self
sourcepub fn eof(&mut self) -> Result<bool>
pub fn eof(&mut self) -> Result<bool>
Test if we are at the end of the stream.
If false, then a proceeding read()
will always succeed.
sourcepub fn held_state(&self) -> Option<u8>
pub fn held_state(&self) -> Option<u8>
The buffered value, which we read while checking for EOF.
pub fn get_ref(&self) -> &R
pub fn get_mut(&mut self) -> &mut R
pub fn into_inner(self) -> R
Trait Implementations§
source§impl<R: Read> Read for Eof<R>
impl<R: Read> Read for Eof<R>
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
For consistency with eof()
, this implementation retries the
operation on ErrorKind::Interrupted
errors.
1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
Like
read
, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
🔬This is a nightly-only experimental API. (
can_vector
)1.0.0 · source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
Read all bytes until EOF in this source, placing them into
buf
. Read more1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
Read all bytes until EOF in this source, appending them to
buf
. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
Read the exact number of bytes required to fill
buf
. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
🔬This is a nightly-only experimental API. (
read_buf
)Pull some bytes from this source into the specified buffer. Read more
source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
🔬This is a nightly-only experimental API. (
read_buf
)Read the exact number of bytes required to fill
cursor
. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Creates a “by reference” adaptor for this instance of
Read
. Read moreAuto Trait Implementations§
impl<R> Freeze for Eof<R>where
R: Freeze,
impl<R> RefUnwindSafe for Eof<R>where
R: RefUnwindSafe,
impl<R> Send for Eof<R>where
R: Send,
impl<R> Sync for Eof<R>where
R: Sync,
impl<R> Unpin for Eof<R>where
R: Unpin,
impl<R> UnwindSafe for Eof<R>where
R: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more