2015-05-16 26 views

回答

13
file.byChunk(4096).joiner 

此读取4096字节块文件和懒惰地加入块在一起成为单个ubyte输入范围。

joiner来自std.algorithm,因此您必须先导入它。

+2

我希望我能够五次上调这个,这是超级有用的,我不知道! –

+0

@ AdamD.Ruppe听起来像是本周D本周的好话题! –

+0

想象一下,这包裹到未来,你只是在数据加载时得到一个事件......好东西。 – DejanLekic

7

,使原始字节范围从文件最简单的方法是只阅读没事到内存:

import std.file; 
auto data = cast(ubyte[]) read("filename"); 
// data is a full-featured random access range of the contents 

如果文件过大,这是合理的,你可以尝试记忆 - 映射文件http://dlang.org/phobos/std_mmfile.html并使用opSlice从中获取数组。由于它是一个数组,因此您可以获得全面的功能,但由于它是由操作系统映射的内存,因此您在触摸文件时会获得懒读。

对于简单InputRange,有LockingTextReader在火卫一(无证),或者你可以自己构建一个在byChunk甚至fgetc,C函数。 fgetc是写最简单的:

struct FileByByte { 
    ubyte front; 
    void popFront() { front = cast(ubyte) fgetc(fp); } 
    bool empty() { return feof(fp); } 
    FILE* fp; 
    this(FILE* fp) { this.fp = fp; popFront(); /* prime it */ } 
} 

我并没有实际测试过,但我敢肯定它会工作。 (顺便说一句,文件打开和关闭与此是分开的,因为范围应该只是数据视图,而不是托管容器。您不希望文件因为您将此范围传递给函数而关闭。)

This是不是一个前锋或随机存取范围虽然。在没有大量缓冲代码的流上执行这些操作会比较棘手,我认为这会导致错误写入 - 通常,范围应该很便宜,而不是模拟底层容器本身不支持的功能。

编辑:其他答案有一个非缓冲的方式! https://stackoverflow.com/a/30278933/1457000太棒了。