Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File io 如何从一个文件创建一个延迟计算范围?_File Io_D - Fatal编程技术网

File io 如何从一个文件创建一个延迟计算范围?

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 但是,例如,如果我只想检索文件的头,那么这种对数据的急切评估可能是不需要的。如果文件格式采用可变长度头或我们希望检索的任

Phobos中的文件I/OAPI相对容易使用,但现在我觉得它与D的range接口没有很好地集成

通过将整个文件读入数组,我可以创建一个范围来分隔全部内容:

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();