Ha! Now that’s horizontal-scrollbar-clear!
In this case, though there are some snippets in the release notes and elsewhere, I’d like critique on a couple of possible basic usage examples for reading a text file line-by-line assuming \n delimiters:
First, an allocator-less one that requires a big-enough buffer:
const io = std.testing.io;
var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
defer file.close(io);
var buf: [1024]u8 = undefined; // must be big enough for an entire line
var reader: std.Io.File.Reader = file.reader(io, &buf);
while(reader.interface.takeDelimiter('\n')) |line| {
if (line) |l| { std.debug.print("line: {s}\n", .{l}); }
else { break; }
} else |err| return err;
Second, using Writer.Allocating:
const io = std.testing.io;
var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
defer file.close(io);
var gpa = std.heap.DebugAllocator(.{}){};
defer _ = gpa.deinit();
const alloc = gpa.allocator();
var line = std.Io.Writer.Allocating.init(alloc);
defer line.deinit();
var buf: [1]u8 = undefined; // ridiculously small for illustration
var reader: std.Io.File.Reader = file.reader(io, &buf);
while(reader.interface.streamDelimiter(&line.writer, '\n')) |count| {
_ = count;
_ = reader.interface.toss(1);
std.debug.print("line: {s}\n", .{line.written()});
line.clearRetainingCapacity();
} else |err| switch (err) {
error.EndOfStream => {}, // while loop done
error.WriteFailed, error.ReadFailed => |e| return e,
}
if (line.written().len > 0) {
std.debug.print("tail: {s}\n", .{line.written()});
}
Please criticize without reservation. I’m not suggesting it’s a model.