首页 文章

在D中逐字节读取文件

提问于
浏览
1

如何在D中逐字节读取文件?

我所拥有的是一个打开的文件,说:

auto f = File("test.bin");

现在我需要读取字节,说:

ubyte first = fgetc(f); // this is whishfull thinking
ubyte second = fgetc(f);

我还需要能够做其他的事情,比如阅读uints,ushorts,skipping(fseek)等等(例如C再次):

fread(&third,2,1,fptr);

奖金问题是,如果有可能一次性阅读一个结构,说我有

struct Test { ubyte a,b,c; uint d,e;  /* etc */ }

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

2 回答

  • 3

    Phobos为此提供了出色的byChunk功能 .

    你真的不想逐个字节地读取文件,而是想要读取块,最好是一个与页面大小相同的块(通常是4 KiB) .

  • 2

    您可以编写自己的 fgetc 函数,将 File 对象上的 rawRead 写入缓冲区,然后返回缓冲区中的下一个可用元素 .

    另一种方法是使用 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);
    

相关问题