如何从文件轻松构建原始的逐字节InputRange/ForwardRange/RandomAccessRange?文件中的字节输入范围
6
A
回答
13
file.byChunk(4096).joiner
此读取4096字节块文件和懒惰地加入块在一起成为单个ubyte
输入范围。
joiner
来自std.algorithm
,因此您必须先导入它。
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太棒了。
相关问题
- 1. 范围长度(文字输入)(DevExpress的)
- 2. AngularJS - 绑定输入文件范围到不同的范围
- 3. 文本框输入数字范围
- 4. 添加输入号码/文字范围
- 5. Apache字节范围和音频文件
- 6. 阵列范围或输入文件
- 7. HTTP字节范围和多部分/字节范围的替代?
- 8. masm字节范围
- 9. 并排的水平输入范围和垂直输入范围
- 10. 输入范围haskell
- 11. 字节[]从Spring MVC中输入文件
- 12. 如何限制输入文本在angular2中的数字范围?
- 13. 文本字段在界面生成器中的输入范围
- 14. 从Scala文件中提取字节的范围
- 15. 范围验证器 - 检查整数范围时输入字母
- 16. 基于Excel中输入的数字范围的输出值
- 17. 数字输入字段排除中间数字的范围
- 18. 替换文件中的数字范围
- 19. PDF字节范围无效
- 20. WSGI字节范围服务
- 21. 支持字节范围
- 22. Pyqt范围输入小部件和python范围
- 23. 字符串索引超出范围,来自文件的字符串输入
- 24. java中的输入范围滑块
- 25. vba中的输入框日期范围?
- 26. 只允许范围内的数字输入到文本框
- 27. 如何获得给定范围内的文件字节?
- 28. CSS:造型范围输入?
- 29. jQuery和范围输入
- 30. 自定义范围输入
我希望我能够五次上调这个,这是超级有用的,我不知道! –
@ AdamD.Ruppe听起来像是本周D本周的好话题! –
想象一下,这包裹到未来,你只是在数据加载时得到一个事件......好东西。 – DejanLekic