[英]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.