1

我想避免设置大小的缓冲区,因为文件太大或足够小以至于缓冲区中有空白空间。ArenaAllocator听起来很有希望,因为您可以根据需要分配更多空间。是否有“正确”的方法来执行此操作,即将作为命令行参数传递的 .json 文件加载到缓冲区中?

4

2 回答 2

1

如何创建与文件大小相同的缓冲区?

您可以请求文件的大小并分配相同的内存量:

var file = try std.fs.cwd().openFile("file.txt", .{ open = true }));

const file_size = (try file.stat()).size;
var buffer = try allocator.alloc(u8, file_size);

然后您可以使用以下命令读取文件readNoEof

try file.reader().readNoEof(buffer);

或者,您可以使用File'readToEndAlloc函数:

const size_limit = std.math.maxInt(u32); // or any other suitable limit
var result = try file.readToEndAlloc(allocator, size_limit);
于 2021-12-02T15:22:23.300 回答
1

使用GeneralPurposeAllocator. 您可以在https://youtu.be/vHWiDx_l4V0中了解有关分配器的更多信息

const std = @import("std");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = &gpa.allocator;
    const args = try std.process.argsAlloc(allocator);
    defer std.process.argsFree(allocator, args);
    const file = try std.fs.cwd().openFile(args[1], .{});
    const file_content = try file.readToEndAlloc(allocator, 1024 * 1024); // 1MB max read size
    defer allocator.free(file_content);
    std.debug.print("{s}", .{file_content});
}
于 2021-12-01T21:04:13.917 回答