On 07/03/2013 01:37 PM, captaindet wrote:

> in C:
>
> typedef struct { /* info */ } INFO;
> INFO info;
> size_t checkio;
> // read INFO from data file:
> pf_datafile = fopen("datafile","rb");
> checkio = fread((char *) &info, sizeof(info), 1, pf_datafile);

Just a reminder: The operation above is not portable. There are endianness and struct member padding issues.

> how do i do this in D?

Assuming that the writer and the reader agree that it works, the closest in Phobos is std.stdio.rawRead.

> the INFO struct might be anywhere in the file, not only at the beginning.

seek() does that.

import std.stdio;

struct Info
{
    size_t a;
    double b;
    byte c;
}

void main()
{
    auto info0 = Info(1, 2.25, 3);
    auto info1 = Info(4, 5.50, 6);

    writeTest("test_file", [ info0, info1 ]);
    readTest("test_file", 0);
    readTest("test_file", 1);
}

void writeTest(string fileName, const(Info)[] infos)
{
    auto file = File(fileName, "w");

    file.rawWrite(infos);
}

void readTest(string fileName, size_t index)
{
    auto file = File(fileName, "r");

    auto offset = index * Info.sizeof;
    file.seek(offset);

    // More than 1 would read as many elements
    auto info = new Info[1];
    file.rawRead(info);

    writefln("Read Info at index %s: %s", index, info);
}

Ali

Reply via email to