如何读取zig文件?

cla*_*l3r 20 zig

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

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

sli*_*ier 29

std.io.reader.readUntilDelimiterOrEof让您std.io.reader逐行阅读任何内容。通常,您可以通过调用 it\xe2\x80\x99s 方法来获取类似文件之类的内容的读取器reader()。例如:

\n
var file = try std.fs.cwd().openFile("foo.txt", .{});\ndefer file.close();\n\nvar buf_reader = std.io.bufferedReader(file.reader());\nvar in_stream = buf_reader.reader();\n\nvar buf: [1024]u8 = undefined;\nwhile (try in_stream.readUntilDelimiterOrEof(&buf, '\\n')) |line| {\n    // do something with line...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

std.io.bufferedReader\xe2\x80\x99t 不是必需的,但建议使用以获得更好的性能。

\n

  • 我知道zig是一个相当低的水平。尽管如此,我还是很惊讶它需要很多行代码来完成一些非常常见的事情,比如将文件读入字符串。每次我想读取文件时,我是否都必须欣赏低水平? (2认同)

Chr*_*ris 8

编辑:从 Zig 0.11.0 开始,此方法可能不再有效,我将保留下面的原始内容并在某个时候更新答案:

我通过查看 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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

上面是一个小演示程序,您应该能够将其放入从 中创建的默认项目中zig init-exe,它只会打印出自己的内容,并带有行号。

如果您提供所需的缓冲区,您也可以在没有分配器的情况下执行此操作。

我还建议您查看这个很棒的资源:https ://ziglearn.org/chapter-2/#readers-and-writers

注意:我目前正在运行 master 的 Zig 开发版本(报告 0.9.0),但我认为这在最近几个正式版本中一直有效。


nlt*_*lta 2

打开文件并获取文件描述符 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