Трейт Seek
Трейт Seek предоставляет возможность изменять текущую позицию курсора в потоке ввода-вывода. Он полезен при работе с файлами, когда нужно перейти к определённому месту в данных. Основным методом трейта является seek, который принимает значение типа SeekFrom и возвращает новую позицию курсора в виде Result<u64>. Тип SeekFrom может принимать три варианта: Start(offset) - отсчёт от начала потока, End(offset) - отсчёт от конца, Current(offset) - отсчёт от текущей позиции.
Синтаксис
trait Seek
{
fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
}
Пример
Давайте откроем файл, запишем в него строку, а затем переместим курсор в начало с помощью SeekFrom::Start и прочитаем содержимое:
use std::fs::File;
use std::io::{Read, Seek, SeekFrom, Write};
fn main()
{
let mut file = File::create("test.txt").unwrap();
file.write_all(b"abcde").unwrap();
file.seek(SeekFrom::Start(0)).unwrap();
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
println!("{}", buffer);
}
Результат выполнения кода:
"abcde"
Пример
Давайте переместим курсор на две позиции от начала и прочитаем оставшуюся часть строки:
use std::fs::File;
use std::io::{Read, Seek, SeekFrom, Write};
fn main()
{
let mut file = File::create("test.txt").unwrap();
file.write_all(b"abcde").unwrap();
file.seek(SeekFrom::Start(2)).unwrap();
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
println!("{}", buffer);
}
Результат выполнения кода:
"cde"
Пример
Давайте переместим курсор на две позиции назад от конца файла и прочитаем последние два символа:
use std::fs::File;
use std::io::{Read, Seek, SeekFrom, Write};
fn main()
{
let mut file = File::create("test.txt").unwrap();
file.write_all(b"abcde").unwrap();
file.seek(SeekFrom::End(-2)).unwrap();
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
println!("{}", buffer);
}
Результат выполнения кода:
"de"