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] 自己使用 Zig 的心得
-
改進 ZigCC 組織下的開源項目 [2]
-
加入微信羣 [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