Как я могу записать весь стандартный ввод в стандартный вывод без использования большого количества памяти? - PullRequest
0 голосов
/ 07 августа 2020

Я хочу написать программу на Rust, которая берет все из стандартного ввода и копирует его в стандартный вывод. Пока у меня это

fn main() {
    let mut stdin: io::Stdin = io::stdin();    
    let mut stdout: io::Stdout = io::stdout();

    let mut buffer: [u8; 1_000_000] = [0; 1_000_000];
    let mut n_bytes_read: usize = 0;
    let mut uninitialized: bool = true;
    while uninitialized || n_bytes_read > 0
    {
        n_bytes_read = stdin.read(&mut buffer).expect("Could not read from STDIN.");
        uninitialized = false;
    }
}

Я копирую все в буфер размером один миллион, чтобы не взорвать память, если кто-то скармливает моей программе 3-гигабайтный файл. Итак, теперь я хочу скопировать это в stdout, но единственная примитивная операция записи, которую я могу найти, - это stdout.write(&mut buffer), но при этом записывается весь буфер! Мне нужен способ записать определенное c количество байтов, например stdout.write_only(&mut buffer, n_bytes_read).

Я хотел бы сделать это максимально c способом, с минимумом стандартной библиотеки импорт.

1 Ответ

3 голосов
/ 07 августа 2020

Если все, что вы хотели сделать, это скопировать из stdin в stdout, не используя много памяти, просто используйте std :: io :: copy . Он передает данные от считывающего устройства к записывающему.

Если ваша цель - записать часть буфера, возьмите часть этого буфера и передайте его write:

stdout.write(&buffer[0..n_bytes_read]);

Срез не копирует данные, поэтому вы больше не будете использовать память.

Обратите внимание, что write может не записывать все, что вы запросили - он возвращает количество фактически записанных байтов. Если вы используете write_all, он запишет весь фрагмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...