2011-12-31 26 views
6

Tôi có một tập tin nhị phân mà thực sự là một chồng các tập tin, định dạng là:Làm thế nào để tôi đọc một BufferedFile sử dụng bộ đệm đọc (ubyte []) khi độ dài bộ đệm được đặt ở thời gian chạy?

lengh_of_subfile,subfile 

length_of_subfile là một 64-bit số nguyên. Tôi có thể đọc các long không có vấn đề nhưng khi tôi cố gắng tạo ra một bộ đệm cho các subfile tôi nhận được lỗi biên dịch nói rằng nó không thể được đọc tại thời gian biên dịch. Tôi đang thiếu gì? Tôi đã viết một công cụ khai thác giống hệt nhau trong erlang, PHP và C# ... D là ném tôi cho một vòng lặp.

void main(string args[]) { 
    Stream file = new BufferedFile(args[1], FileMode.In); 
    int counter = 0; 
    while(file.position < file.size) { 
     ulong len; 
     file.read(len); 
     ubyte[len] ogg; 
     file.read(ogg); 
     string outname = getcwd() ~ "/" ~ to!string(counter) ~ ".ogg"; 
     Stream oggout = new BufferedFile(outname, FileMode.OutNew); 
     oggout.write(ogg); 
     writefln("Creating file " ~ to!string(counter) ~ ".ogg"); 
     counter++; 
    } 
} 
+2

Bạn cần một [mảng động] (http: // stackoverflow.com/questions/8363728/d-dynamic-array-initialization-stride-and-the-index-operation). (Tôi không có ý tưởng làm thế nào, mặc dù, bởi vì tôi không lập trình trong D) – Ryan

Trả lời

7

Thay vì

 ubyte[len] ogg; 

ghi

 ubyte[] ogg = new ubyte[len]; 
+0

Cảm ơn hoàn hảo. – b0redom

1

Bạn có thể sử dụng một mảng với chiều dài năng động hoặc chỉ sử dụng mới để tạo ra một mảng ubyte mới:

new ubyte[len] 
2

cắt bỏ những gì bạn muốn điền vào

ubyte[1024*8] ogg; 
ogg=ogg[0..len] 
file.read(ogg); 

hoặc sử dụng một vòng lặp để làm việc sao chép (như là một byte mảng 2^64 sẽ không phù hợp trong bộ nhớ)

ubyte[1024*16] ogg; 
while(len>0 && (int read=file.read(ogg[0..$>len?len:$]))!=0){ 
    oggout.write(ogg[0..read]); 
    len-=read;//len is the amount still to be read 
} 

mặt lưu ý writeln("Creating file ",counter, ".ogg"); là hiệu quả hơn concat sau đó viết (cách java) bởi vì nó không tạo ra chuỗi vô dụng (và tạo chuỗi định dạng trong thời gian chạy là yêu cầu một lỗi sớm hay muộn trên % đầu tiên bạn không giải thích)

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