几天前,我在为ZX Spectrum编写TAP文件生成器。为了将字节递增地写入输出,我将在Delphi或C ++上使用流,但是不推荐使用D流。
所以我选择了rawWrite。至于字节存储,是std.containers中的Array!uint (更正为Array!ubyte)。但是rawWrite只能写传统数组,不能写容器。似乎没有简单的方法可以将Array转换为数组。 (使用.array可用于Array!uint,但不能用于Array!ubyte)
最后,我使用了一个简单的动态数组,但给人一种用户不友好的感觉。
答案 0 :(得分:2)
始终可以使用 std.array.array 函数从Array数据中获取一个数组,如下面的D代码所示:
import std.algorithm;
import std.stdio;
import std.range;
import std.container.array;
void main() {
auto fn = "test.dat";
// scope(exit) std.file.remove(fn);
auto f = File(fn,"wb");
Array!ubyte myarr = [ubyte(5), ubyte(4), ubyte(3), ubyte(2), ubyte(1)];
f.rawWrite(myarr.array);
}
将其保存到arr2.d中,然后编译并运行:
dmd arr2.d && ./arr2
让我们验证它是否写了我们期望的内容:
hexdump -C test.dat
00000000 05 04 03 02 01 |.....|
00000005
答案 1 :(得分:1)
std.containers.array.Array
拥有并完全封装其数据,并且不提供对其的直接访问。这是因为它管理数据的生存期,因此对Array
的任何操作都会使指向其内部数据的所有指针无效。因此,获得Array
元素作为连续向量的唯一方法是将它们一个接一个地复制到例如。标准D数组。 std.array.array
函数可将任意范围复制到D数组,以帮助完成此任务:
import std.array;
import std.container.array;
Array!uint ci = [1, 2, 3];
uint[] ai = ci.array;
assert(ai == [1, 2, 3]);
Array!ubyte cb = [ubyte(1), ubyte(2), ubyte(3)];
ubyte[] ab = cb.array;
assert(ab == [ubyte(1), ubyte(2), ubyte(3)]);
在这一点上,将Array
元素直接写入文件或完全避免使用Array
似乎并没有太大优势。