2015-01-21 24 views
5

API tệp I/O trong Phobos tương đối dễ sử dụng, nhưng hiện tại tôi cảm thấy nó không được tích hợp rất tốt với giao diện dải D.Làm thế nào để tạo một phạm vi được đánh giá lười biếng từ một tệp?

tôi có thể tạo ra một phạm vi phân chia ranh giới các nội dung đầy đủ bằng cách đọc toàn bộ tập tin vào một mảng:

import std.file; 
auto mydata = cast(ubyte[]) read("filename"); 
processData(mydata); // takes a range of ubytes 

Nhưng đánh giá háo hức này của dữ liệu có thể được không mong muốn nếu tôi chỉ muốn lấy tiêu đề của một tập tin, cho thí dụ. Tham số upTo không giải quyết được sự cố này nếu định dạng của tệp giả định tiêu đề có độ dài thay đổi hoặc bất kỳ phần tử nào khác mà chúng tôi muốn truy lục. Nó thậm chí có thể ở giữa tệp và read buộc tôi đọc tất cả tệp đến thời điểm đó.

Nhưng thực sự, có các lựa chọn thay thế. readf, readln, byLine và đặc biệt nhất là byChunk cho phép tôi truy xuất các mẩu dữ liệu cho đến khi tôi đến cuối tệp hoặc chỉ khi tôi muốn ngừng đọc tệp.

import std.stdio; 
File file("filename"); 
auto chunkRange = file.byChunk(1000); // a range of ubyte[]s 
processData(chunkRange); // oops! not expecting chunks! 

Nhưng bây giờ tôi đã giới thiệu sự phức tạp của đối phó với khối kích thước cố định của dữ liệu, chứ không phải là một loạt liên tục của byte. Vì vậy, làm thế nào tôi có thể tạo một phạm vi đầu vào đơn giản của byte từ một tập tin được đánh giá lười biếng, hoặc bằng các ký tự hoặc theo khối nhỏ (để giảm số lần đọc)? Phạm vi trong ví dụ thứ hai có được đóng gói liền mạch theo cách dữ liệu có thể được xử lý như trong ví dụ đầu tiên không?

Trả lời

7

Bạn có thể sử dụng std.algorithm.joiner:

auto r = File("test.txt").byChunk(4096).joiner(); 

Lưu ý rằng byChunk reuses bộ đệm tương tự cho mỗi đoạn, vì vậy bạn có thể cần thêm .map!(chunk => chunk.idup) để uể oải sao chép các khối để đống.

+0

Điều đó dường như hoạt động mà không ánh xạ từng đoạn vào không gian bộ nhớ của chính nó. Sau khi tất cả, một 'InputRange' đã mong đợi tuần tự đọc một lần. Bạn có thể nghĩ về một trường hợp thực sự cần thiết không? –

+0

Có lẽ nó không bao giờ cần thiết như bạn nói. –

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