master
Raw Download raw file
 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}