簡體   English   中英

如何讀取 zig 中的文件?

[英]How to read a file in zig?

如何讀取 zig 文件,並逐行運行?

我確實找到os.File.openRead ,但它似乎很舊,因為它說container 'std.os' has no member called 'File'

std.io.reader.readUntilDelimiterOrEof可讓您std.io.reader.readUntilDelimiterOrEof讀取任何std.io.reader 您通常通過調用它的reader()方法來獲取文件之類的reader() 例如:

var file = try std.fs.cwd().openFile("foo.txt", .{});
defer file.close();

var buf_reader = std.io.bufferedReader(file.reader());
var in_stream = buf_reader.reader();

var buf: [1024]u8 = undefined;
while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| {
    // do something with line...
}

std.io.bufferedReader不是強制性的,但建議使用以獲得更好的性能。

打開文件並取回文件描述符std.os.open

https://ziglang.org/documentation/0.6.0/std/#std;os.open

從文件std.os.read讀取

https://ziglang.org/documentation/0.6.0/std/#std;os.read

我在 zig 標准庫中找不到 .readlines() 樣式函數。 您必須編寫自己的循環才能找到\\n字符。

我通過查看 Zig 庫源代碼/文檔混淆了這一點,所以這可能不是最慣用的方式:

const std = @import("std");

pub fn main() anyerror!void {
    //  Get an allocator
    var gp = std.heap.GeneralPurposeAllocator(.{ .safety = true }){};
    defer _ = gp.deinit();
    const allocator = &gp.allocator;

    // Get the path
    var path_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined;
    const path = try std.fs.realpath("./src/main.zig", &path_buffer);

    // Open the file
    const file = try std.fs.openFileAbsolute(path, .{ .read = true });
    defer file.close();

    // Read the contents
    const buffer_size = 2000;
    const file_buffer = try file.readToEndAlloc(allocator, buffer_size);
    defer allocator.free(file_buffer);

    // Split by "\n" and iterate through the resulting slices of "const []u8"
    var iter = std.mem.split(file_buffer, "\n");

    var count: usize = 0;
    while (iter.next()) |line| : (count += 1) {
        std.log.info("{d:>2}: {s}", .{ count, line });
    }
}

上面是一個小演示程序,您應該能夠將其放入從zig init-exe創建的默認項目中,它只會打印出它自己的內容,並帶有行號。

如果您提供所需的緩沖區,您也可以在沒有分配器的情況下執行此操作。

我還建議查看這個很棒的資源: https : //ziglearn.org/chapter-2/#readers-and-writers

注意:我目前正在從 master 運行 Zig 的開發版本(報告 0.9.0),但我認為這在最近的幾個官方版本中一直有效。

下面是一個測試用例,展示了如何創建文件、寫入文件然后打開同一個文件並讀取其內容。

const std = @import("std");
const testing = std.testing;
const expect = testing.expect;

test "create a file and then open and read it" {
    var tmp_dir = testing.tmpDir(.{}); // This creates a directory under ./zig-cache/tmp/{hash}/test_file
    // defer tmp_dir.cleanup(); // commented out this line so, you can see the file after execution finished.

    var file1 = try tmp_dir.dir.createFile("test_file", .{ .read = true });
    defer file1.close();

    const write_buf: []const u8 = "Hello Zig!";
    try file1.writeAll(write_buf);

    var file2 = try tmp_dir.dir.openFile("test_file", .{});
    defer file2.close();

    const read_buf = try file2.readToEndAlloc(testing.allocator, 1024);
    defer testing.allocator.free(read_buf);

    try testing.expect(std.mem.eql(u8, write_buf, read_buf));
}

在 Github 或本地計算機上的<zig-install-dir>/lib/fs/test.zig下查看fs package 測試

另請注意,測試分配器僅適用於測試。 在您的實際源代碼中,您需要選擇一個合適的分配器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM