users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to redirect stdout


From: Alexandre Saidi
Subject: Re: How to redirect stdout
Date: Wed, 02 Mar 2005 09:31:38 +0100
User-agent: Mozilla Thunderbird 0.7 (X11/20040615)

Hi there,
Following my question about "stdout redirection in Gprolog", Gurvan Le Guernic gave a general
 answer ("script" command under Unix/Linux) that did the job.
I post it hereby.

This works not only for Gprolog but also for any command.
In order to gather (to mirror) outputs, launch " script -c gprolog myfile" and "myfile" is a mirrir of the stdout :
(see "man script" also).

Here's an example (sorry for Windoz users !):
---------------------------------------------------------

address@hidden:> script -c gprolog toto
Le script a débuté, le fichier est toto
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- write(1).
1

yes
| ?- listing.

yes
.......................

| ?- halt.

Script complélé, le fichier est toto
address@hidden:>

address@hidden:> cat toto
Le script a débuté sur mar 01 mar 2005 19:58:00 CET
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- write(1).
1

yes
| ?- listing.

yes
.....................
| ?- halt.
Script complété sur mar 01 mar 2005 19:58:10 CET
---------------------------------

AS

Alexandre Saidi a écrit :
Dear Lindsey,
In my question, 'lising' was juste an (unfortunate) example !

I learned however how I'll do  for thisparticular  predicate.

I dont want to boder you so much (specially Gurvan Le Guernic gave an answer that's quite ok, for this task and so forth. Merci beaucoup à Gurvan Le Guernic).

However, I tried  the following with no sucess.
Don't worry. things seem much tighter !

I want to thak you for all your answers and post this one :
Is there any way to have documents (other than "taking a deep look" at the source of gprolog) to know these low-level predicats ?
Answers would come from there, if any.

cheers.
Merci
--------------------------------
address@hidden:~> gprolog
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- [user].
compiling user for byte code...
entier(0).
entier(succ(N)) :- entier(N).

user compiled, 3 lines read - 346 bytes written, 5319 ms

yes
| ?- open(fichier,write,F), current_input(I), current_output(O), '$set_top_level_streams'(I, F),entier(succ(succ(0))), '$set_top_level_streams'(I, O), close(F).

F = '$stream'(2)
I = '$stream'(0)
O = '$stream'(1)

yes
| ?- halt.

ZZZ : I tried with other examples that normaly give 'yes' or 'no' withe variables or not.

---------------------------------

Lindsey Spratt a écrit :

I did some more investigating...

The particular predicate with which you are testing the redirection of output, listing/0, sends its output to the "top level output", not stdout. So, redirecting stdout doesn't affect the output of listing/0.

Here is an approach that does redirect the output of listing/0, using the internal '$set_top_level_streams'/2 predicate:

======
[Lindsey-Spratts-Computer:~/Documents] lindsey% gprolog
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- [user].
compiling user for byte code...
toto:-true.
user compiled, 2 lines read - 205 bytes written, 8773 ms

yes
| ?- open(fichier,write,F), current_input(I), current_output(O), '$set_top_level_streams'(I, F), listing, '$set_top_level_streams'(I, O), close(F).


F = '$stream'(2)
I = '$stream'(0)
O = '$stream'(1)

yes
| ?- halt.
[Lindsey-Spratts-Computer:~/Documents] lindsey% cat fichier

toto.
[Lindsey-Spratts-Computer:~/Documents] lindsey%
=====

The redirection using set_output/1 should work when redirecting the output from the 'write/1' predicate.

Cheers,
Lindsey Spratt

On Mar 1, 2005, at 11:30 AM, Alexandre Saidi wrote:

Thanks Lindsey,
I've been trying any thing I could to make it work.
Ther's no way !
As I said, I saw a mail in the FAQ saying that stdout is not affected by set_output.
I'm using the version 1.2.16.
Perhaps ther'is is a trick withe the interactive mode ?

Thanks any way.
---------------------------------------------
Here's what I do under prolog (for a test) :
address@hidden:~> gprolog
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- [user].
compiling user for byte code...
toto :- true.

user compiled, 2 lines read - 207 bytes written, 4104 ms

yes
| ?- open(fichier,write,F), current_output(Old), set_output(F), listing, flush_output(F), flush_output, close(F).

toto.

F = '$stream'(2)
Old = '$stream'(1)

(1 ms) yes
| ?- halt.
address@hidden:~>

The file 'fichier' is empty.
I've done many other tests with no success.
---------------------------------------------------------

Lindsey Spratt a écrit :

Perhaps flush_output(F) before the close(F), or simply 'flush_output', would help.
Lindsey
On Mar 1, 2005, at 3:04 AM, Alexandre Saidi wrote:

Thanks for your help.

I'd already tried :

| ?-open('/home/alex/fichier',write,F), current_output(Old), set_output(F), a_call, close(F), set_output(Old).

But the file 'fichier' is of size 0 !

So what's wrong with my code?
should I flush something ?

regards.

AS



--
Aleksander S. Saidi
Ecole Centrale de Lyon
Département Mathématiques-Informatique
Mél : address@hidden
Tél : 04.72.18.65.30, Fax : 04.78.33.16.15





--
Aleksander S. Saidi
Ecole Centrale de Lyon
Département Mathématiques-Informatique
Mél : address@hidden
Tél : 04.72.18.65.30, Fax : 04.78.33.16.15




reply via email to

[Prev in Thread] Current Thread [Next in Thread]