微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在zig中读取文件?

如何解决如何在zig中读取文件?

如何在 zig 中读取文件并逐行运行?

我确实找到了 os.File.openRead,但它似乎很旧,因为它说 container 'std.os' has no member called 'File'

解决方法

打开文件并取回文件描述符 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),但我认为这适用于最近的几个官方版本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。