gpt4 book ai didi

d - 写这个的 D 方式是什么?

转载 作者:行者123 更新时间:2023-12-04 03:30:51 27 4
gpt4 key购买 nike

I wrote this program in C还有 in erlang

为了练习,我尝试用 D 重写。一个 friend 也用 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);
}
}

看来我不能只对 arr 使用 fread。 sizeof 是 16,当我到达减法部分时它会出现段错误。我无法自动分配静态数组,或者至少我不知道如何分配。我似乎也无法使用 malloc,因为当我在循环字节时尝试强制转换 void* 时它会给我错误。你会怎么写这个,或者,我还能做什么更好?

最佳答案

再说一遍,为什么您希望能够将整个块读入单个数组(以字节为单位的大小适合 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;
}

我正在使用 rawRead rawWrite 读写

关于d - 写这个的 D 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706466/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com