2012-01-02 63 views
5

I wrote this program in Cin erlang写这个的方法是什么?

为了实践我试图D.重写一个朋友还写它d但wrote it differently

步骤很简单。伪代码:

While not end of file: 
    X = Read ulong from file and covert to little endian 
    Y = Read X bytes from file into ubyte array 
    subtract 1 from each byte in Y 
    save Y as an ogg file 

我d尝试:

import std.file, std.stdio, std.bitmanip, std.conv, core.stdc.stdio : fread; 
void main(){ 
    auto file = File("./sounds.pk", "r+"); 
    auto fp = file.getFP(); 
    ulong x; 
    int i,cnt; 
    while(fread(&x, 8, 1, fp)){ 
    writeln("start"); 
    x=swapEndian(x); 
    writeln(x," ",cnt++,"\n"); 
    ubyte[] arr= new ubyte[x]; 
    fread(&arr, x, 1, fp); 
    for(i=0;i<x;i++) arr[i]-=1; 
    std.file.write("/home/fold/wak_oggs/"~to!string(cnt)~".ogg",arr); 
    } 
} 

看来我不能只用FREAD上ARR。 sizeof是16,当我到达减法部分时它给出了分段错误。我不能自动分配一个静态数组,或者至少我不知道如何。我也似乎无法使用malloc,因为当我尝试在通过字节循环时抛出void *时,它会给出错误。你会如何写这个,或者,我能做得更好?

+2

确定'&arr'指向数组的第一个元素? – hvd 2012-01-02 23:52:41

回答

5

为什么你期望能够将整个块读入单个数组(字节大小适合64位长(可能更多几PB),我也在另一个问题中做了这个评论

使用循环复制的内容

writeln("start"); 
x=swapEndian(x); 
writeln(x," ",cnt++,"\n"); 
ubyte[1024*8] arr=void; //the buffer 
      //initialized with void to avoid auto init (or declare above the for) 
ubyte b; //temp buff 
File out = File("/home/fold/wak_oggs/"~to!string(cnt)~".ogg", "wb"); 

b=fp.rawRead(arr[0..x%$]);//make it so the buffer can be fully filled each loop 
foreach(ref e;b)e-=1;//the subtract 1 each byte loop 
out.rawWrite(b); 
x-=b.length; 
while(x>0 && (b=fp.rawRead(arr[])).length>0){//loop until x becomes 0 
    foreach(ref e;b)e-=1; 
    out.rawWrite(b); 
    x-=b.length; 
} 

我使用rawReadrawWrite读写

3

arr不是一个指针,并且不会像在C和C++中那样转换为指针。

如果您想要一个指向数组开头的指针,请使用arr.ptr

要分配一个静态数组,可以使用:

ubyte[N] arr; 

然而,N必须是一个编译时间常数(就像C和C++),所以它可能没有多大用处在这里。

相关问题