2010-10-05 31 views
9

¿Cómo leer y escribir en archivos binarios en el lenguaje D? En C sería:E/S de archivos binarios


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

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

He encontrado RawWrite en D docs, pero no conocen el uso, ni si lo hace lo que pienso. fread es de C:

T [] rawRead (T) ([] tampón T);

Si el archivo no se abre, arroja una excepción. De lo contrario, llama al fread para el identificador de archivo y lo arroja por error.

rawRead siempre lee en modo binario en Windows.

Respuesta

7

rawRead y RawWrite deben comportarse exactamente como fread, fwrite, sólo ellos son plantillas para cuidar de tamaños y longitudes de argumentos.

p. Ej.

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 se implementa en términos de fread como

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; 
    } 
+0

Gracias por la gran respuesta. –

+0

¿Qué sucede si sus datos ya están en la memoria (recibidos de una llamada de API) en lugar de en el disco? La api Stream no es compatible con rawRead, y no hay ningún identificador de archivo para pasar a .fread ... –

2

Si lo que desea es leer en una gran memoria intermedia de valores (por ejemplo, Ints), sólo tiene que hacer:

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

y

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

Por supuesto, si yo Si tiene más datos estructurados, la respuesta de Scott Wales es más apropiada.

Cuestiones relacionadas