Страницы

Поиск по вопросам

пятница, 28 июня 2019 г.

Прочитать с середины файл без чтения его начала на Rust'е

let f = File::open("file").unwrap(); let reader = BufReader::new(f).seek(io::SeekFrom::Start(2)); for b in reader.iter().next() { println!("{}", b); }
Выводит то, что находится внутри io::SeekFrom::Start, т.е. 2.


Ответ

Какой-то странный цикл у вас. По идее должно быть как-то так:
let f = File::open("file").unwrap(); let mut reader = BufReader::new(f); reader.seek(io::SeekFrom::Start(2)).unwrap(); for b in reader.bytes() { println!("{}", b); }
Метод seek() возвращает Result, то есть новую позицию в файле. Он вызывается на &mut self, значит reader должен быть mut, иначе не заработает.
Что делает ваш код: вы открываете файл и смещаете указатель на 2 байта, сохраняя Result в reader. Потом вы преобразовываете Result в итератор с помощью iter() и вызываете на итераторе next(), получаете Option, равный Some(2). А потом по опции итерируете (Option<_> реализует IntoIterator, так что этому типу можно итерировать). Итератор весело выдаёт один элемент — 2.
Чтобы избежать подобных ошибок в будущем, внимательно читайте документацию на используемые трейты и типы: ни в трейте Read, ни в типе BufReader нет метода iter(), однако в Read есть метод bytes(), который вам был нужен. А вот метод Seek::seek возвращает Result. Кроме того стоит больше прочитать про интерфейс итераторов, так как вы, судя по всему, до конца не поняли эту идею, раз вызываете на итераторе метод next() явно.

Комментариев нет:

Отправить комментарий