2010-10-05 2 views
9

Comment lire et écrire des fichiers binaires en langage D? En C serait:E/S de fichier binaire


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

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

Je trouve rawwrite à D docs, mais je ne sais pas l'utilisation, ni si le fait que je pense. fread est de C:

T [] rawRead (T) (T Tampon []);

Si le fichier n'est pas ouvert, déclenche une exception. Sinon, appelle fread pour le handle de fichier et renvoie une erreur. RawRead toujours lu en mode binaire sous Windows.

Répondre

7

rawRead et rawwrite doivent se comporter exactement comme fread, fwrite, seulement ils sont des modèles pour prendre soin de la taille des arguments et des longueurs.

par exemple.

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 est mis en œuvre en termes de fread comme

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

Merci pour la bonne réponse. –

+0

Que se passe-t-il si vos données sont déjà en mémoire (reçues d'un appel API) et non sur disque? L'api Stream ne supporte pas rawRead, et il n'y a pas de handle de fichier à transmettre à .fread ... –

2

Si vous voulez juste lire dans un grand tampon de valeurs (par exemple, ints), vous pouvez simplement faire:

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

et

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

Bien sûr, si yo Si vous avez des données plus structurées, la réponse de Scott Wales est plus appropriée.