#
Организация ввода данных с клавиатуры
В одной из предыдущих статей блога я уже рассказывал, что с версии 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});
}