2011-12-31 6 views
6

は、私は本当にファイルのスタックであるバイナリファイルを持っている、形式は次のとおりです。実行時にバッファ長を設定すると、read(ubyte []バッファ)を使用してBufferedFileを読み取るにはどうすればよいですか?

lengh_of_subfile,subfile 

length_of_subfileは、64ビットの整数です。 longを読むことができますが、サブファイル用のバッファを作成しようとするとコンパイル時に読み込めないというエラーが表示されます。私は何が欠けていますか?私はerlang、PHP、C#で同じ抽出ツールを書いています... Dはループのために私を投げています。

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

[動的配列](http:// /vindions/8363728/d-dynamic-array-initialization-stride-and-the-exexoperation)。 (私はDでプログラムしていないので、しかし、どのように、私は考えていない) – Ryan

答えて

7

代わりの

 ubyte[len] ogg; 

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

完璧なありがとう。 – b0redom

1

あなたはダイナミックな長さの配列を使用するか、単に新しいUBYTE配列を作成するために新しいを使用することができます。

new ubyte[len] 
2

を書きますあなたが記入したいものを切り取る

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

またはコピーを行うためにループを使用します(2^64バイト配列は文句を言わないメモリに収まるよう)

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 
} 

サイドノートwriteln("Creating file ",counter, ".ogg");は連結よりも効率的であるその後、(Javaの道を)書きます無用な文字列を作成しないため(実行時にフォーマット文字列を作成すると、最初に%にエラーを尋ねる)

関連する問題