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.

Reply via email to