如何用D语言读写二进制文件?在C中将是:
FILE *fp = fopen("/home/peu/Desktop/bla.bin", "wb");
char x[4] = "RIFF";
fwrite(x, sizeof(char), 4, fp);
Run Code Online (Sandbox Code Playgroud)
我在D docs找到了rawWrite ,但我不知道用法,也不知道我的想法.fread来自C:
T [] rawRead(T)(T [] buffer);
如果文件未打开,则抛出异常.否则,为文件句柄调用fread并抛出错误.
rawRead始终在Windows上以二进制模式读取.
不知道是否是可能的,我想收到也许data[n]还是data[n][n][n].在C可以(如果错误,纠正我):
void save_data(void* arr, int n, int dimensions)
{
// do ugly things
}
Run Code Online (Sandbox Code Playgroud)
但必须在D中存在一种更优雅的方式.
说我要处理ushort和uint一些方法,但string不同的.所以我猜我需要一个专门的模板string和其他两个ushort和uint.是吗?
// for most
void func(T)(T var) { ... }
// for uint and ushort
void func(T: uint, ushort)(T var) { ... }
Run Code Online (Sandbox Code Playgroud)
这是想法,虽然代码无法编译.它有效还是非常糟糕?
我在设计D应用程序时遇到了麻烦.也许我的方法完全错了,所以我来这里救你.任何建议,包括完全重写,都是受欢迎的.
我有一些模板类型:
enum Type : byte { Message='!', Integer='@' }
struct Token (T) {
Type type;
T value;
}
alias Token!string MessageToken;
alias Token!long IntegerToken;
Run Code Online (Sandbox Code Playgroud)
我需要一般地处理这些类型:
AnyToken genToken(bool cond) {
if (cond)
return MessageToken(Type.Message, "nighly builds");
else
return IntegerToken(Type.Integer, -42);
}
AnyToken a = genToken(true);
AnyToken b = genToken(false);
Run Code Online (Sandbox Code Playgroud)
我该如何达到这个效果?编辑:欢迎OOP替代品.
我有结构
struct RGBA (T) {/* ... */}
struct BMPFile (DataT) if (is(DataT == RGBA)) {/* ... */}
Run Code Online (Sandbox Code Playgroud)
但是is(DataT == RGBA)因为DataT是一个类型而RGBA是一个模板,所以无法工作.相反,我需要检查,如果一个类型是一个模板的实例化以声明file状
BMPFile!(RGBA!ushort) file;
Run Code Online (Sandbox Code Playgroud)
@FeepingCreature在评论中表示
struct RGBA(T) {
alias void isRGBAStruct;
}
struct BMPFile (DataT) if (is(DataT.isRGBAStruct)) {}
Run Code Online (Sandbox Code Playgroud)
虽然工作我没有提示alias void isRGBAStruct,这似乎是一个黑客.希望std.traits将涵盖这一点.
我想将以下结构作为类成员,但我不知道它的类型T,所以我需要在运行时"声明"结构.
struct Chunk (T) {
string id;
T[][] data;
}
class FileBla {
this() {
Chunk !int ck; // need to be turned in a class member
}
}
Run Code Online (Sandbox Code Playgroud)
应该遗漏一些容易的东西.