2015-05-16 19 views
6

Ham byte-by-bayt kolay bir şekilde InputRange/ForwardRange/RandomAccessRange bir dosyadan nasıl oluşturulur? dair makul olabilmesi için dosya çok büyükseByte InputRange dosyadan

import std.file; 
auto data = cast(ubyte[]) read("filename"); 
// data is a full-featured random access range of the contents 

, bir bellek deneyebilirsiniz:

cevap

13
file.byChunk(4096).joiner 

Bu 4096 baytlık parçalar halinde bir dosya okur ve tembel tek ubyte giriş aralığına birlikte parçalar katıldı.

joinerstd.algorithm, bu nedenle önce onu almanız gerekir.

+2

Keşke bunu beş kez yapabilirim, bu çok yararlı ve ben bunu bilmiyordum! –

+0

@ AdamD.Ruppe, bu haftanın D'de Bu Hafta için iyi bir konuya benziyor! –

+0

Bunun bir geleceğe sarılmış olduğunu düşünün, ve veri yüklendiğinde sadece bir etkinlik alıyorsunuz ... İyi şeyler. – DejanLekic

7

bir dosyadan ham bayt aralığı yapmak için en kolay yolu sadece bunu belleğe tamam okumaktır bir dosya http://dlang.org/phobos/std_mmfile.html ve bir dizi almak için opSlice kullanın. Bir dizi olduğu için, tam kapsamlı özelliklere sahip olursunuz, ancak işletim sistemi tarafından eşlenen bellek olduğundan, dosyaya dokunduğunuzda tembel okuma elde edersiniz. Basit InputRange için

, Phobos içinde LockingTextReader (belgesiz) vardır, ya sen byChunk hatta fgetc, C fonksiyonu üzerinden bir kendini inşa edecek. fgetc yazmak için en kolay olacaktır: Aslında o kadar test etmedim

struct FileByByte { 
    ubyte front; 
    void popFront() { front = cast(ubyte) fgetc(fp); } 
    bool empty() { return feof(fp); } 
    FILE* fp; 
    this(FILE* fp) { this.fp = fp; popFront(); /* prime it */ } 
} 

ama o iş olur eminim. (BTW dosya açma ve kapatma bundan ayrıdır çünkü aralıklar yalnızca yönetilen kaplara değil, yalnızca veriye bakması gerekir. Bu aralığı bir işleve dönüştürdüğünüz için dosyanın kapatılmasını istemezsiniz.)

olsa da değil bir ileri veya rasgele erişim aralığıdır. Çok fazla kodlama kodu olmadan akışları yapmak çok daha zordur ve bence yazmayı denemek bir hata olur - genellikle, aralıklar ucuz olmalı, altta yatan kapsayıcıların doğal olarak desteklemediği özelliklere sahip olmamalıdır.

DÜZENLEME: Diğer yanıtın arabelleğe alınmayan bir yolu var! https://stackoverflow.com/a/30278933/1457000 Bu harika.