Я призываю вас научиться создавать Минимальный, Полный и Проверяемый пример .Это ценный навык, который профессиональные программисты используют для лучшего понимания проблем и сосредоточения внимания на важных аспектах проблемы.Например, вы не указали фактический входной файл, поэтому очень сложно воспроизвести ваше поведение с помощью предоставленного вами кода.
После проб и ошибок я смог уменьшить вашу проблемук этому коду:
use std::io::{self, BufRead};
fn main() -> io::Result<()> {
let mut reader = io::BufReader::with_capacity(100, io::repeat(b'a'));
let a = reader.fill_buf()?.len();
reader.consume(98);
let b = reader.fill_buf()?.len();
println!("{}, {}", a, b); // 100, 2
Ok(())
}
К сожалению, для вашего случая такое поведение разрешено контрактом BufRead
и фактически почти требуется .Смысл буферизованного читателя состоит в том, чтобы максимально избегать вызовов основного читателя.Эта черта не знает, сколько байтов нужно прочитать, и она не знает, что 2 байта недостаточно, и она должна выполнить еще один вызов.Если щелкнуть по-другому, представьте, что вы израсходовали только 1 байт из 100 - хотели бы вы, чтобы все 99 оставшихся байтов были скопированы в память, а затем выполнили еще одно базовое чтение?Это было бы медленнее, чем вообще не использовать BufRead
!
Эта черта также не имеет каких-либо условий для перемещения оставшихся байтов в буфере в начало и последующего заполнения буфера снова.Это то, что может быть добавлено к бетону BufReader
, поэтому вы можете добавить запрос на добавление, чтобы добавить его.
На данный момент, я бы рекомендовал использоватьRead::read_exact
в конце буфера:
use std::io::{self, BufRead, Read};
fn main() -> io::Result<()> {
let mut reader = io::BufReader::with_capacity(100, io::repeat(b'a'));
let a = reader.fill_buf()?.len();
reader.consume(98);
let mut leftover = [0u8; 4]; // a single UTF-8 character is at most 4 bytes
// Assume we know we need 3 bytes based on domain knowledge
reader.read_exact(&mut leftover[..3])?;
let b = reader.fill_buf()?.len();
println!("{}, {}", a, b); // 100, 99
Ok(())
}
См. Также: