gpt4 book ai didi

file-io - 如何从文件创建延迟计算范围?

转载 作者:行者123 更新时间:2023-12-02 13:53:46 24 4
gpt4 key购买 nike

Phobos中的File I/O API相对容易使用,但目前我感觉它与D的range接口(interface)集成得不太好。

我可以通过将整个文件读入数组来创建一个范围来界定完整内容:

import std.file;
auto mydata = cast(ubyte[]) read("filename");
processData(mydata); // takes a range of ubytes

但是,例如,如果我只想检索文件的 header ,这种对数据的急切评估可能是不受欢迎的。如果文件的格式采用可变长度 header 或我们希望检索的任何其他元素,则 upTo 参数无法解决此问题。它甚至可能位于文件的中间,并且 read 强制我读取该点之前的所有文件。

但事实上,还有其他选择。 readfreadlnbyLine 以及最特别的是 byChunk 让我检索数据片段,直到到达末尾文件,或者当我想停止读取文件时。

import std.stdio;
File file("filename");
auto chunkRange = file.byChunk(1000); // a range of ubyte[]s
processData(chunkRange); // oops! not expecting chunks!

但是现在我介绍了处理固定大小的数据 block 而不是连续的字节范围的复杂性。

那么,如何从按字符或按小块(以减少读取次数)进行延迟计算的文件中创建简单的字节输入范围?第二个示例中的范围是否可以无缝封装,以便可以像第一个示例中那样处理数据?

最佳答案

您可以使用std.algorithm.joiner :

auto r = File("test.txt").byChunk(4096).joiner();

请注意,byChunk 为每个 block 重用相同的缓冲区,因此您可能需要添加 .map!(chunk => chunk.idup) 来延迟复制 block 到堆。

关于file-io - 如何从文件创建延迟计算范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com