Двоичный файл ввода / вывода - PullRequest
9 голосов
/ 05 октября 2010

Как читать и записывать в двоичные файлы на языке D? В C будет:


    FILE *fp = fopen("/home/peu/Desktop/bla.bin", "wb");
    char x[4] = "RIFF";

    fwrite(x, sizeof(char), 4, fp);

Я нашел rawWrite на D docs , но я не знаю, как это сделать, и если я не знаю, что я думаю fread от C:

T [] rawRead (T) (буфер T []);

Если файл не открыт, выдается исключение. В противном случае вызывает fread для дескриптора файла и выдает ошибку.

rawRead всегда читается в двоичном режиме в Windows.

Ответы [ 2 ]

7 голосов
/ 05 октября 2010

rawRead и rawWrite должны вести себя точно так же, как fread, fwrite, только они являются шаблонами, чтобы заботиться о размерах и длине аргументов.

, например

 auto stream = File("filename","r+");
 auto outstring = "abcd";
 stream.rawWrite(outstring);
 stream.rewind();
 auto inbytes = new char[4];
 stream.rawRead(inbytes);
 assert(inbytes[3] == outstring[3]);

rawRead реализован в терминах fread как

 T[] rawRead(T)(T[] buffer)
    {
        enforce(buffer.length, "rawRead must take a non-empty buffer");
        immutable result =
            .fread(buffer.ptr, T.sizeof, buffer.length, p.handle);
        errnoEnforce(!error);
        return result ? buffer[0 .. result] : null;
    }
2 голосов
/ 05 октября 2010

Если вы просто хотите прочитать в большом буфере значений (скажем, в целых числах), вы можете просто сделать:

int[] ints = cast(int[]) std.file.read("ints.bin", numInts * int.sizeof);

и

std.file.write("ints.bin", ints);

Конечно, если у вас есть более структурированные данные, тогда ответ Скотта Уэльса более уместен.

...