2015-05-16 14 views

Trả lời

13
file.byChunk(4096).joiner 

này đọc một tập tin trong khối 4096 byte và uể oải tham gia các khối với nhau thành một dải ubyte đầu vào duy nhất.

joiner là từ std.algorithm, vì vậy bạn sẽ phải nhập mã đó trước tiên.

+2

Tôi ước mình có thể upvote năm lần, điều đó rất hữu ích và tôi không biết điều đó! –

+0

@ AdamD.Ruppe âm thanh như một chủ đề tốt cho Tuần này trong D! –

+0

Hãy tưởng tượng điều này được bao bọc trong tương lai và bạn chỉ nhận được sự kiện khi dữ liệu được tải ... Nội dung hay. – DejanLekic

7

Cách đơn giản nhất để thực hiện một loạt byte liệu từ một tập tin là chỉ cần đọc nó tất cả ngay vào bộ nhớ:

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

Nếu tập tin là quá lớn cho điều đó là hợp lý, bạn có thể thử một ký ức tệp được ánh xạ http://dlang.org/phobos/std_mmfile.html và sử dụng opSlice để xóa mảng. Vì nó là một mảng, bạn nhận được các tính năng đầy đủ, nhưng vì nó là bộ nhớ được ánh xạ bởi hệ điều hành, bạn sẽ đọc được khi bạn chạm vào tệp.

Đối với InputRange đơn giản, có LockingTextReader (không có giấy tờ) trong Phobos hoặc bạn có thể tự xây dựng một mình trên byChunk hoặc thậm chí fgetc, hàm C. fgetc sẽ là cách dễ nhất để viết:

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

Tôi chưa thực sự thử nghiệm nhưng tôi khá chắc chắn rằng nó hoạt động. (BTW tập tin mở và đóng là riêng biệt này vì phạm vi được coi là chỉ xem vào dữ liệu, không được quản lý container. Bạn sẽ không muốn các tập tin đóng cửa chỉ vì bạn đã vượt qua phạm vi này vào một chức năng.)

không phải một phạm vi truy cập chuyển tiếp cũng không ngẫu nhiên. Đó là những điều phức tạp hơn để thực hiện trên luồng mà không cần nhiều mã đệm và tôi nghĩ đó là một sai lầm khi cố gắng viết - nói chung, phạm vi phải rẻ, không tính năng mô phỏng mà vùng chứa cơ bản không hỗ trợ.

EDIT: Câu trả lời khác có cách không đệm! https://stackoverflow.com/a/30278933/1457000 Thật tuyệt vời.

Các vấn đề liên quan