2015-05-16 12 views

Antwort

13
file.byChunk(4096).joiner 

Dieser liest eine Datei in 4096-Byte-Chunks und träge verbindet die Stücke zusammen in einen einzigen ubyte Eingangsbereich.

joiner ist von std.algorithm, so müssen Sie es zuerst importieren.

+2

Ich wünschte, ich könnte dies fünf Mal verbessern, das ist super nützlich und ich wusste das nicht! –

+0

@ AdamD.Ruppe klingt wie ein gutes Thema für diese Woche in dieser Woche in D! –

+0

Stellen Sie sich dies in eine Zukunft verpackt vor, und Sie erhalten nur ein Ereignis, wenn die Daten geladen werden ... Gute Sachen. – DejanLekic

7

Der einfachste Weg, um einen rohen Byte-Bereich aus einer Datei zu machen, ist es einfach alles in Ordnung in dem Speicher zu lesen:

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

Wenn die Datei für die zu groß ist, vernünftig zu sein, können Sie einen Speicher könnten versuchen, -mapped-Datei http://dlang.org/phobos/std_mmfile.html und verwenden Sie die opSlice, um ein Array davon abzurufen. Da es sich um ein Array handelt, erhalten Sie die Funktionen des vollen Bereichs, aber da es vom Betriebssystem Speicher zugeordnet ist, erhalten Sie beim Lesen der Datei faul lesen.

Für eine einfache InputRange, gibt es LockingTextReader (ohne Papiere) in Phobos, oder könnten Sie selbst eine Beurteilung über byChunk oder sogar fgetc, die C-Funktion konstruieren. fgetc wäre am einfachsten zu schreiben:

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 */ } 
} 

Ich habe eigentlich nicht so getestet, aber ich bin mir ziemlich sicher, dass es funktionieren würde. (Übrigens ist das Öffnen und Schließen der Datei davon getrennt, da Bereiche nur Ansichten in Daten und nicht in verwalteten Containern sein sollen. Sie möchten nicht, dass die Datei geschlossen wird, nur weil Sie diesen Bereich in eine Funktion übergeben haben.)

ist nicht ein Vorwärts-oder Random-Access-Bereich obwohl. Das ist bei Streams, die nicht viel Puffer-Code enthalten, etwas komplizierter, und ich denke, das wäre ein Fehler beim Schreiben. Im Allgemeinen sollten die Bereiche billig sein und keine Funktionen emulieren, die der zugrunde liegende Container nicht nativ unterstützt.

EDIT: Die andere Antwort hat eine nicht puffernde Weise! https://stackoverflow.com/a/30278933/1457000 Das ist großartig.