On 02/05/2011 06:26 PM, scottrick wrote:
Hi,
I am new to D. I am trying to write a binary file parser for a
project of mine and I thought it would be fun to try and learn a new
language at the same time. So I chose D! :D I have been
struggling however and have not been able to find very many good
examples, so I am posting this message.
I think I'm supposed to be using std.stdio, but I'm not 100% sure.
Could somebody post a short example of how to parse a couple of
characters and ints or whatever from a file? Or how to read, say,
the next however many bytes into a struct?
Also, looking at the documentation, I am confused by this method
signature:
T[] rawRead(T)(T[] buffer);
I understand that T is generic type, but I am not sure of the
meaning of the (T) after the method name.
Thanks,
Below a pair of examples that should make all this clearer: a templated
hand-written naive map func, and a template struct type (would be nearly the
same for a class). Just run it. Additional explanations on demand.
import File=std.file;
import std.array;
Out[] map (In, Out) (In[] source, Out delegate (In) f) {
// (0)
Out[] target;
foreach (element; source)
target ~= f(element);
return target;
}
struct StoreStack (T) {
T[] items;
string logFileName;
this (string logFileName, T[] items=[]) {
this.items = items;
this.logFileName = logFileName;
// create/reset log file
File.write(logFileName, "");
}
string toString () {
static form = "StoreStack(\"%s\", %s)";
return format(form, this.logFileName, this.items);
}
void put (T item) {
this.items ~= item;
string message = format("put item: %s\n", item);
File.append(logFileName, message);
}
T take () {
T item = this.items[$-1];
this.items = this.items[0..$-1];
string message = format("took item: %s\n", item);
File.append(logFileName, message);
return item;
}
}
unittest {
// map
string hex (uint i) { return format("0x%03X", i); }
uint[] decs = [1, 3, 9, 27, 81, 243, 729];
auto hexes = map!(uint,string)(decs, &hex);
// auto hexes = map(decs, &hex); // (1)
writefln ("decs: %s\n-->\nhexes: %s", decs, hexes);
writeln();
// StoreStack
auto store = StoreStack!(int)("test_log");
// auto store = StoreStack!int("test_log"); // (2)
store.put(3); store.put(2); store.put(3);
auto i = store.take();
writefln("store: %s", store);
writefln("log:\n%s", File.readText("test_log"));
}
void main() {}
(0) The func must be declared as delegate (instead of simple func pointer)
because: the actual func hex beeing defined in a block, the compiler turns it
into a delegate. Detail.
(1) Here, the compiler is able to infer the template parameters (types): no
need to specify them.
(2) When there is a single template parameter, the syntax allows omitting ()
around it.
Denis
--
_________________
vita es estrany
spir.wikidot.com