# Организация ввода данных с клавиатуры

В 
Опубликовано 2026-02-16

В одной из предыдущих статей блога я уже рассказывал, что с версии 0.15.1 в Zig изменились принципы ввода/вывода данных, в т.ч. получение доступа к stdin/stdout.

В данной статье я расскажу, как организовать ввод данных с клавиатуры в консоли.

Для начала, нам нужно получить доступ к stdin. В процессе изучения документации пришло понимание, что теперь это делается не через std.io, а через std.fs.

const stdin = std.fs.File.stdin();

Дальнейшее копание привело к концепции Reader'ов и Writer'ов. Reader - базовый тип, который реализует интерфейс Reader.

Мы будем использовать базовый тип Reader, который можно получить у stdin.

const stdin = std.fs.File.stdin();
var reader = stdin.reader();

Но тут всё не просто, такой код не заработает, поскольку ридеру нужно передать указатель на буфер, в который он будет записывать данные.

const stdin = std.fs.File.stdin();

var buffer: [1024]u8 = undefined;
var reader = stdin.reader(&buffer);

Ридер получен, буфер для ввода ему предоставили. Теперь можно использовать ридер для ввода данных. Вопрос как, поскольку у самого Reader нет метода read. Дальнейшее копание привело к тому, что ридер реализует интерфейс Reader в своем свойстве interface. В интерфейсе есть метод discardDelimiterExclusive, который нужно использовать для ввода данных, ожидая, когда встретится определенный символ, например перенос строки. Этот метод возвращает количество символов, которые были введены с клавиатуры в буфер до нажатия клавиши Enter.

Теперь можно использовать ридер для ввода данных.

const stdin = std.fs.File.stdin();
var buffer: [1024]u8 = undefined;
var reader = stdin.reader(&buffer);

const line_length = reader.interface.discardDelimiterExclusive('\n') catch {
	std.debug.print("Ошибка при вводе данных\n", .{});
    return;
};

В итоге мы получили длину строки, которую ввели с клавиатуры и саму строку в нашем буфере. Получить данные из буфера можно предельно просто, сделав его срез buffer[0..line_length].

const stdin = std.fs.File.stdin();
var buffer: [1024]u8 = undefined;
var reader = stdin.reader(&buffer);

const line_length = reader.interface.discardDelimiterExclusive('\n') catch {
	std.debug.print("Ошибка при вводе данных\n", .{});
	return;
};

std.debug.print("Вы ввели: {s}\n", .{buffer[0..line_length]});

Вот, собственно, и вся магия ввода данных с клавиатуры в консоли. Полный текст простейшей программы для демонстрации ввода данных с клавиатуры в консоли:

const std = @import("std");

pub fn main() void {
    const stdin = std.fs.File.stdin();
    var buffer: [1024]u8 = undefined;
    var reader = stdin.reader(&buffer);

    std.debug.print("Введите строку и нажмите клавишу Enter: ", .{});
    const line_length = reader.interface.discardDelimiterExclusive('\n') catch {
        std.debug.print("Ошибка при вводе данных\n", .{});
        return;
    };

    const line = buffer[0..line_length];
    std.debug.print("Вы ввели: {s}\n", .{line});
}