给定以下代码:
let any_offset: u64 = 42; let mut file = File::open("/home/user/file").unwrap(); file.seek(SeekFrom::Start(any_offset)); // println!("{:?}", file.cursor_position())
如何获得当前光标位置?
sbtkgmzw1#
您应该使用相对偏移量0调用Seek:seek。这没有副作用,并返回您要查找的信息。Seek可用于多种类型,包括:
Seek:seek
Seek
impl Seek for File
impl<'_> Seek for &'_ File
impl<'_, S: Seek + ?Sized> Seek for &'_ mut S
impl<R: Seek> Seek for BufReader<R>
impl<S: Seek + ?Sized> Seek for Box<S>
impl<T> Seek for Cursor<T> where
impl<W: Write + Seek> Seek for BufWriter<W>
不过,使用Cursor类mentioned by Aaronepower可能更有效,因为这样可以避免进行额外的系统调用。
Cursor
bf1o4zei2#
根据Seek trait API,新位置是通过seek函数返回的,但是您也可以获取File的数据,并将其放置在Vec中,然后将Vec Package 在Cursor中,Cursor包含获取当前位置的方法。
File
Vec
let any_offset: u64 = 42; let mut file = File::open("/home/user/file").unwrap(); let new_position = file.seek(SeekFrom::Start(any_offset)).unwrap(); println!("{:?}", new_position);
use std::io::Cursor; let any_offset: u64 = 42; let mut file = File::open("/home/user/file").unwrap(); let contents = Vec::new(); file.read_to_end(&mut contents); let mut cursor = Cursor::new(contents); cursor.seek(SeekFrom::Start(any_offset)); println!("{:?}", cursor.position());
nnvyjq4y3#
从Rust 1.51.0(2021)开始,Seek特性上有了stream_position()方法。
stream_position()
use std::io::Seek; let pos = file.stream_position().unwrap();
然而,看看链接文档中的源代码,这纯粹是一个方便的 Package 器,它在后台使用相同的SeekFrom::Current(0)实现。
SeekFrom::Current(0)
3条答案
按热度按时间sbtkgmzw1#
您应该使用相对偏移量0调用
Seek:seek
。这没有副作用,并返回您要查找的信息。Seek
可用于多种类型,包括:impl Seek for File
impl<'_> Seek for &'_ File
impl<'_, S: Seek + ?Sized> Seek for &'_ mut S
impl<R: Seek> Seek for BufReader<R>
impl<S: Seek + ?Sized> Seek for Box<S>
impl<T> Seek for Cursor<T> where
impl<W: Write + Seek> Seek for BufWriter<W>
不过,使用
Cursor
类mentioned by Aaronepower可能更有效,因为这样可以避免进行额外的系统调用。bf1o4zei2#
根据
Seek
trait API,新位置是通过seek函数返回的,但是您也可以获取File
的数据,并将其放置在Vec
中,然后将Vec
Package 在Cursor
中,Cursor
包含获取当前位置的方法。无光标
带光标
nnvyjq4y3#
从Rust 1.51.0(2021)开始,
Seek
特性上有了stream_position()
方法。然而,看看链接文档中的源代码,这纯粹是一个方便的 Package 器,它在后台使用相同的
SeekFrom::Current(0)
实现。