如何在D?
中逐字节读取文件我所拥有的是一个打开的文件,比如说:
auto f = File("test.bin");
现在我需要读取字节,比如说:
ubyte first = fgetc(f); // this is whishfull thinking
ubyte second = fgetc(f);
我还需要能够做其他的事情,例如读取uints,ushorts,跳过(fseek)等等(C再次):
fread(&third,2,1,fptr);
红利问题是,如果有可能一次性阅读一个结构,比如说我有
struct Test { ubyte a,b,c; uint d,e; /* etc */ }
我可以从二进制文件中读取它吗?
答案 0 :(得分:3)
您可以编写自己的fgetc
函数,将rawRead
对象上的File
写入缓冲区,然后返回缓冲区中的下一个可用元素。
另一种方法是使用core.stdc.stdio
模块并执行C风格的文件I / O:
import cio = core.stdc.stdio;
...
FILE* fp = cio.fopen("test.bin", "rb");
foreach (int i; 0..100) {
auto c = cio.fgetc(fp);
...
}
cio.fclose(fp);
至于阅读结构,也可以使用rawRead
来完成。例如:
struct Test {
align(1):
ubyte a, b;
short c;
}
...
Test t;
auto binFile = File("test.bin", "r");
binFile.rawRead((&t)[0..1]); // Read into the buffer made up of t
writefln("%x %x %x", t.a, t.b, t.c);
答案 1 :(得分:2)
Phobos为此提供了出色的byChunk功能。
你真的不想逐个字节地读取文件,而是想要读取块,最好是与页面大小相同的块(通常为4 KiB)。