On Monday, 3 March 2014 at 22:22:06 UTC, Christof Schardt wrote:
"John Colvin" <john.loughran.col...@gmail.com> schrieb im
Newsbeitrag
news:dyfkblqonigrtmkwt...@forum.dlang.org...
On Monday, 3 March 2014 at 21:44:16 UTC, Christof Schardt
wrote:
I'm evaluating D and try to write a binary io class.
I got stuck with strings:
void rw(ref string x)
{
if(_isWriting)
{
int size = x.length;
_f.rawWrite((&size)[0..1]);
_f.rawWrite(x);
}
else
{
int size;
_f.rawRead((&size)[0..1]);
... what now?
}
}
Writing is ok, but how do I read the bytes to the
string x after having its size?
Assuming you're not expecting pre-allocation (which I infer
from your choice of "ref string" instead of "char[]"), you
could do this:
void rw(ref string x)
{
if(_isWriting)
{
size_t size = x.length;
_f.rawWrite((&size)[0..1]);
_f.rawWrite(x);
}
else
{
size_t size;
_f.rawRead((&size)[0..1]);
auto tmp = new char[size];
_f.rawRead(tmp);
import std.exception : assumeUnique;
x = tmp.assumeUnique;
}
}
Thanks, John, this works.
Though it feels a bit strange, that one has to do such trickery
in order to
perform basic things like binary io of strings.
Doesn't seem like trickery to me; you just make a new array of
the correct size and then fill it from the file. Is that not what
you expected to do?
The only thing that is unusual is assumeUnique, but if you
understand that string is an alias to immutable(char)[] then it
should be apparent why it's there. You could just write "x =
cast(string)tmp;" instead, it's the same.