master
1const std = @import("std");
2
3const ReaderType = std.fs.File.Reader;
4const BufReaderType = std.io.BufferedReader(4096, ReaderType);
5const BufReaderReaderType = BufReaderType.Reader;
6
7pub const ReadByLineIterator = struct {
8 file: std.fs.File,
9 reader: ReaderType,
10 buf_reader: BufReaderType,
11 stream: ?BufReaderReaderType,
12 buf: [4096]u8,
13
14 pub fn next(self: *@This()) !?[]u8 {
15 if (self.stream == null) {
16 self.stream = self.buf_reader.reader();
17 }
18 if (self.stream) |stream| {
19 return stream.readUntilDelimiterOrEof(&self.buf, '\n');
20 }
21 unreachable;
22 }
23
24 pub fn deinit(self: *@This()) void {
25 self.file.close();
26 }
27};
28
29// Iterate over the lines in the file using a buffered reader.
30// Caller is responsible for calling deinit() on returned iterator when done.
31pub fn iterLines(filename: []const u8) !ReadByLineIterator {
32 var file = try std.fs.cwd().openFile(filename, .{});
33 var reader = file.reader();
34 var buf_reader = std.io.bufferedReader(reader);
35
36 return ReadByLineIterator{
37 .file = file,
38 .reader = reader,
39 .buf_reader = buf_reader,
40 .stream = null,
41 .buf = undefined,
42 };
43}