Возможно ли использовать форматирование без буфера в Zig?
Изучая Zig, я наткунлся на такую проблему: я захотел вывести число в stdout, но не тут-то было! stdout.write не поддерживает форматирования. Пришлось лезть в std.fmt (да это можно сделать с помощью std.debug.print, но я решил делать правильно, через std.fs.File.stdout), вот что получилось (после довольно продолжительного труда и гуглинга):
const std = @import("std");
pub fn main() !void {
var writer = std.fs.File.stdout();
var buf: [3]u8 = undefined;
try writer.writeAll(try std.fmt.bufPrint(&buf, "{d} ", .{5}));
}
Но меня смутило, что я не вывожу buf. Дело в том, что, когда я пытался его вывести, выводилось что-то вроде �5 (да, длину buf можно уменьшить, но этот код - упрощённый вариант, в действительности используется цикл for).
Так вот, возможно ли не использовать переменную buf, но всё-таки использовать форматирование?
PS: Желательно также не использовать allocPrint.
UPD: Есть вариант с использование fmt.format, но для получения объекта Writer из std.fs.File.stdout() нужно вызывать метод writer(), которому всё равно надо передавать буфер: вообщем, тоже самое...
Ответы (2 шт):
Попробуйте std.fmt.format с writer. Должно получится что-то такое:
var writer = std.io.getStdOut().writer();
try std.fmt.format(writer, "{d}\n", .{5});
После некоторых исследований, я понял, что, по-видимому, без буфера сделать вывод форматированным нельзя, но возможно использовать пустой буфер и не определять его как отдельную переменную.
Как-то так:
var writer = std.fs.File.stdout().writer(&[_]u8{}); // (1)
try writer.interface.print("{d}", .{5}); // (2)
- Получаем объект
Writerизstdout, передавая пустой буфер&[_]u8{}; - Выводим число
5с помощью функцииwriter.interface.print.