Làm thế nào để xây dựng dễ dàng một byte nguyên-by-byte InputRange/ForwardRange/RandomAccessRange từ một tập tin?Byte InputRange từ tập tin
Trả lời
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.
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.)
là 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.
- 1. Lưu tập tin từ một byte [] trong C# NET 3.5
- 2. Lưu mảng byte vào tập tin
- 3. Python Viết byte vào tập tin
- 4. Cách đọc nội dung tập tin từ một tập tin?
- 5. tập tin tải về một mảng byte như là một tập tin trong javascript/ExtJS
- 6. Làm thế nào để có được byte (byte []) từ một tập tin được tải lên trong Grails
- 7. PHP đọc tập tin như một mảng byte
- 8. C# Nối mảng byte vào tập tin hiện có
- 9. Lưu byte âm thanh [] vào tập tin wav
- 10. Đọc từ tập tin
- 11. So sánh tập tin qua các vấn đề về byte Byte
- 12. Viết byte vào một tập tin mà không cần xóa byte hiện
- 13. Mở tập tin và đọc từ tập tin Objective-c
- 14. Lấy đối tượng tập tin từ tập tin Đầu vào
- 15. Đọc tập tin từ torrent
- 16. Launch tập tin từ Java
- 17. cách đáng tin cậy để chuyển đổi một tập tin vào một byte []
- 18. Khó đọc từ Tập tin Ánh xạ Bộ nhớ
- 19. Tạo đường dẫn tập tin ảo từ dòng
- 20. Tải tập tin từ Dropbox và lưu nó vào sdcard
- 21. Nhiều chủ đề đọc từ cùng một tập tin
- 22. C++ đọc unsigned char từ luồng tập tin
- 23. Tạo CSS từ một tập tin HTML
- 24. Đọc từ tập tin trong eclipse
- 25. tải .so tập tin từ bộ nhớ
- 26. chạy một tập tin vbs từ java
- 27. tháo^M từ một tập tin csv
- 28. Chỉnh sửa tập tin từ dockerfile
- 29. Tải tập tin từ xa vào grails
- 30. Đọc từ tập tin sử dụng fgets
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 đó! –
@ AdamD.Ruppe âm thanh như một chủ đề tốt cho Tuần này trong D! –
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