Newbie problem
Roger Stokes
rs at rogerstokes.free-online.co.uk
Thu Jun 20 00:58:03 PDT 2013
Many thanks, Ali
I put together your suggestions, and it all works correctly !
Thanks again.
On Wednesday, 19 June 2013 at 19:50:55 UTC, Ali Çehreli wrote:
> On 06/19/2013 12:14 PM, Roger Stokes wrote:
>
> > and the result compiled and executed with no error signals,
> but the
> > resulting output of the file-copy was not the same as the
> input, it
> > looked like this:
> >
> > std.concurrency.OwnerTerminated at std\concurrency.d(248): Owner
> terminated
>
> For a clean exit, the owner must tell the worker that there is
> no more data (see struct Done below). It must then wait for it
> to exit (see core.thread.thread_joinAll below):
>
> import std.stdio;
> import std.concurrency;
> import core.thread;
>
> struct Done
> {}
>
> void main() {
> enum bufferSize = 1024 * 100;
> auto tid = spawn(&fileWriter);
> // Read loop
> foreach (ubyte[] buffer; stdin.byChunk(bufferSize)) {
> send(tid, buffer.idup);
> }
>
> tid.send(Done());
>
> import core.thread;
> thread_joinAll();
> }
>
> void fileWriter() {
> // Write loop
> bool done = false;
>
> while (!done) {
> receive(
> (immutable(ubyte)[] buffer) {
> stdout.write(buffer);
> },
>
> (Done _) {
> done = true;
> });
> }
> }
>
>
> > ----------------
> > [47, 47, 32, 101, 120, 97, ....
> >
> > ....
> > The numbers 47, 47, 32, etc look like the ASCII indexes of
> the characters
> > which should be in the output, not the characters themselves!
>
> You are writing ubyte[]. What you see is the default output for
> such a slice. If you are sure that the data is UTF-8, then you
> can cast before outputting:
>
> stdout.write(cast(string)buffer);
>
> Ali
More information about the Digitalmars-d-learn
mailing list