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!