On Wednesday, 1 May 2013 at 13:56:48 UTC, Tim Keating wrote:
On Wednesday, 1 May 2013 at 04:33:28 UTC, anonymous wrote:
Just outBuf ~= buf.dup; works, too. Without .dup you're overwriting and appending the same chunk of memory again and again.
From the documentation on File.readln
(<http://dlang.org/phobos/std_stdio#readln>): "Note that reusing the buffer means that the previous contents of it has to be copied if needed."
I'm a bit puzzled as for why it behaves differently with dchar.

Okay, that was obviously the bit I was missing. The dchar situation IS baffling -- if that hadn't worked, I would have been more certain I was simply doing something wrong.

The wchar and dchar versions don't reuse the buffer. Not sure why. Here's the implementation, complete with relevant TODO

size_t readln(C)(ref C[] buf, dchar terminator = '\n') if (isSomeChar!C && !is(C == enum))
    {
        static if (is(C == char))
        {
enforce(_p && _p.handle, "Attempt to read from an unopened file.");
            return readlnImpl(_p.handle, buf, terminator);
        }
        else
        {
            // TODO: optimize this
            string s = readln(terminator);
            if (!s.length) return 0;
            buf.length = 0;
            foreach (wchar c; s)
            {
                buf ~= c;
            }
            return buf.length;
        }
    }

Oh dear!

Reply via email to