Thread overview
stdout redirect
Apr 11, 2012
Andrea Fontana
Apr 11, 2012
Andrea Fontana
Apr 11, 2012
Stefan
Apr 12, 2012
Andrea Fontana
Apr 12, 2015
Philip Stuckey
Apr 12, 2015
FreeSlave
Apr 13, 2015
Rikki Cattermole
April 11, 2012
How can I redirect stdout / stderr to file (from D not shell)?
April 11, 2012
On Wednesday, 11 April 2012 at 12:46:30 UTC, Andrea Fontana wrote:
> How can I redirect stdout / stderr to file (from D not shell)?

Self-reply:

It works using std.c way:

import std.cstream;
std.c.stdio.freopen(args[4].ptr, "w+", dout.file);
std.c.stdio.freopen(args[4].ptr, "w+", derr.file);


April 11, 2012
On Wednesday, 11 April 2012 at 13:00:45 UTC, Andrea Fontana wrote:
> On Wednesday, 11 April 2012 at 12:46:30 UTC, Andrea Fontana wrote:
>> How can I redirect stdout / stderr to file (from D not shell)?
>
> Self-reply:
>
> It works using std.c way:
>
> import std.cstream;
> std.c.stdio.freopen(args[4].ptr, "w+", dout.file);
> std.c.stdio.freopen(args[4].ptr, "w+", derr.file);

Careful: D strings are not zero-terminated. args[4].toStringz() is the safer choice.

Cheers,
Stefan
April 12, 2012
On Wednesday, 11 April 2012 at 15:25:56 UTC, Stefan wrote:
> On Wednesday, 11 April 2012 at 13:00:45 UTC, Andrea Fontana wrote:
>> On Wednesday, 11 April 2012 at 12:46:30 UTC, Andrea Fontana wrote:
>>> How can I redirect stdout / stderr to file (from D not shell)?
>>
>> Self-reply:
>>
>> It works using std.c way:
>>
>> import std.cstream;
>> std.c.stdio.freopen(args[4].ptr, "w+", dout.file);
>> std.c.stdio.freopen(args[4].ptr, "w+", derr.file);
>
> Careful: D strings are not zero-terminated. args[4].toStringz() is the safer choice.
>
> Cheers,
> Stefan

Good point Stefan!

April 12, 2015
On Thursday, 12 April 2012 at 08:11:58 UTC, Andrea Fontana wrote:
> On Wednesday, 11 April 2012 at 15:25:56 UTC, Stefan wrote:
>> On Wednesday, 11 April 2012 at 13:00:45 UTC, Andrea Fontana wrote:
>>> On Wednesday, 11 April 2012 at 12:46:30 UTC, Andrea Fontana wrote:
>>>> How can I redirect stdout / stderr to file (from D not shell)?
>>>
>>> Self-reply:
>>>
>>> It works using std.c way:
>>>
>>> import std.cstream;
>>> std.c.stdio.freopen(args[4].ptr, "w+", dout.file);
>>> std.c.stdio.freopen(args[4].ptr, "w+", derr.file);
>>
>> Careful: D strings are not zero-terminated. args[4].toStringz() is the safer choice.
>>
>> Cheers,
>> Stefan
>
> Good point Stefan!

why not:
import std.stdio;
stdout = File(args[4], "w+");
stderr = File(args[4], "w+");

April 12, 2015
On Sunday, 12 April 2015 at 04:39:06 UTC, Philip Stuckey wrote:
> why not:
> import std.stdio;
> stdout = File(args[4], "w+");
> stderr = File(args[4], "w+");

It just replaces the object, not redirects output. E.g. if you use printf somewhere it will use stdout, not file.
April 13, 2015
On 13/04/2015 1:12 a.m., FreeSlave wrote:
> On Sunday, 12 April 2015 at 04:39:06 UTC, Philip Stuckey wrote:
>> why not:
>> import std.stdio;
>> stdout = File(args[4], "w+");
>> stderr = File(args[4], "w+");
>
> It just replaces the object, not redirects output. E.g. if you use
> printf somewhere it will use stdout, not file.

You will need to use writefln instead of printf. As printf uses the processes stdout. Changing this would be tricky and OS based.