File io 如何从一个文件创建一个延迟计算范围?
Phobos中的文件I/OAPI相对容易使用,但现在我觉得它与D的range接口没有很好地集成 通过将整个文件读入数组,我可以创建一个范围来分隔全部内容:File io 如何从一个文件创建一个延迟计算范围?,file-io,d,File Io,D,Phobos中的文件I/OAPI相对容易使用,但现在我觉得它与D的range接口没有很好地集成 通过将整个文件读入数组,我可以创建一个范围来分隔全部内容: import std.file; auto mydata = cast(ubyte[]) read("filename"); processData(mydata); // takes a range of ubytes 但是,例如,如果我只想检索文件的头,那么这种对数据的急切评估可能是不需要的。如果文件格式采用可变长度头或我们希望检索的任
import std.file;
auto mydata = cast(ubyte[]) read("filename");
processData(mydata); // takes a range of ubytes
但是,例如,如果我只想检索文件的头,那么这种对数据的急切评估可能是不需要的。如果文件格式采用可变长度头或我们希望检索的任何其他元素,则upTo
参数无法解决此问题。它甚至可以在文件的中间,并且<代码> Read <代码>强迫我读取所有文件到那个点。
但事实上,还有其他选择readf
,readln
,byLine
,尤其是byChunk
允许我检索数据片段,直到我到达文件末尾,或者在我想停止读取文件的时候
import std.stdio;
File file("filename");
auto chunkRange = file.byChunk(1000); // a range of ubyte[]s
processData(chunkRange); // oops! not expecting chunks!
但现在我介绍了处理固定大小数据块的复杂性,而不是处理连续的字节范围
那么,我如何从一个延迟计算的文件中创建一个简单的字节输入范围,可以是字符,也可以是小块(以减少读取次数)?第二个示例中的范围是否可以像第一个示例中那样无缝封装数据?您可以使用:
请注意,
byChunk
对每个块重复使用相同的缓冲区,因此您可能需要添加.map!(chunk=>chunk.idup)
将块惰性地复制到堆。这似乎可以在不将每个块映射到自己的内存空间的情况下工作。毕竟,InputRange
已经要求顺序一次性读取。你能想出一个真正需要这样做的例子吗?也许你说的根本不需要这样做。
auto r = File("test.txt").byChunk(4096).joiner();