在D中逐字节读取文件

时间:2014-05-27 12:00:11

标签: windows file d dmd

如何在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 */ }

我可以从二进制文件中读取它吗?

2 个答案:

答案 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)。