Zig 逐行讀取文件

Zig 中有一個 Reader 類型,它提供了多種讀取文件的方法,如 readAll、readInt。 在這裏,我們將使用 streamUntilDelimiter 分割行。

const std = @import("std");
const fs = std.fs;
const print = std.debug.print;
pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();
    const file = try fs.cwd().openFile("tests/zig-zen.txt", .{});
    defer file.close();
    // Wrap the file reader in a buffered reader.
    // Since it's usually faster to read a bunch of bytes at once.
    var buf_reader = std.io.bufferedReader(file.reader());
    const reader = buf_reader.reader();
    var line = std.ArrayList(u8).init(allocator);
    defer line.deinit();
    const writer = line.writer();
    var line_no: usize = 0;
    while (reader.streamUntilDelimiter(writer, '\n', null)) {
        // Clear the line so we can reuse it.
        defer line.clearRetainingCapacity();
        line_no += 1;
        print("{d}--{s}\n", .{ line_no, line.items });
    } else |err| switch (err) {
        error.EndOfStream => { // end of file
            if (line.items.len > 0) {
                line_no += 1;
                print("{d}--{s}\n", .{ line_no, line.items });
            }
        },
        else => return err, // Propagate error
    }
    print("Total lines: {d}\n", .{line_no});
}

需要注意的是,讀到文件末尾時,Zig 會返回 EOF 的錯誤,因此我們需要特殊處理這種情況,否則的話,可能會遺漏掉最後一行。

加入我們

Zig 中文社區是一個開放的組織,我們致力於推廣 Zig 在中文羣體中的使用,有多種方式可以參與進來:

  1. 供稿,分享 [1] 自己使用 Zig 的心得

  2. 改進 ZigCC 組織下的開源項目 [2]

  3. 加入微信羣 [3]

參考資料

[1]

供稿,分享:https://ziglang.cc/contributing

[2]

開源項目:https://ask.ziglang.cc/github

[3]

微信羣:https://ask.ziglang.cc/weixin

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6Or0N7hQ-aiyG3SELE9-Bg