Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conserver stdin

6 réponses
Avatar
Jean Pierre Daviau
Bonjour à tous,

Si je lis stdin et l'envoie dans un fichier, y a-t-il moyen de
conserver stdin autrement que d'utiliser le fichier où j'ai
copier son flux?

Amicalement

Jean Pierre Daviau
--
windows Xp
asus p4 s533/333/133
Intel(R) Celeron (R) CPU 2.00 GHz
Processor Radeon7000 0x5159 agp

6 réponses

Avatar
Xavier Roche
Si je lis stdin et l'envoie dans un fichier, y a-t-il moyen de
conserver stdin autrement que d'utiliser le fichier où j'ai
copier son flux?


Non. Même si ungetc() peut ressembler à ce que vous voulez faire, son
usage est un peu désuet et sa spécification un peu limitée (en gros, un
seul caractère peut être "remis" dans le flux de manière sûre)
<http://www.opengroup.org/pubs/online/7908799/xsh/ungetc.html>

Avatar
Jean Pierre Daviau
Donc, il faudrait quelque chose genre
char tampon[256];
char tampon[];
tampon = fgets(tampon, sizeof(tampon), stdin);
-----------
Ici je crois que la norme veut une constante?
char tampon[fgets(tampon, sizeof(tampon), stdin)];
??

w

"Xavier Roche" a écrit dans le
message de news: f91oo3$nv$
Si je lis stdin et l'envoie dans un fichier, y a-t-il moyen de
conserver stdin autrement que d'utiliser le fichier où j'ai
copier son flux?


Non. Même si ungetc() peut ressembler à ce que vous voulez
faire, son usage est un peu désuet et sa spécification un peu
limitée (en gros, un seul caractère peut être "remis" dans le
flux de manière sûre)
<http://www.opengroup.org/pubs/online/7908799/xsh/ungetc.html>



Avatar
Pascal Bourguignon
"Jean Pierre Daviau" writes:

Bonjour à tous,

Si je lis stdin et l'envoie dans un fichier, y a-t-il moyen de
conserver stdin autrement que d'utiliser le fichier où j'ai
copier son flux?


Non. Mais si tu es faignant, tu peux utiliser tee:

( tee copy-of-stdin - | ton-programme copy-of-stdin ) < input

Il faut que ton-programme lise d'abord stdin, et quand c'est fini, il
peut lire le fichier indiqué en argument.


--
__Pascal Bourguignon__ http://www.informatimago.com/

Avatar
Vincent Lefevre
Dans l'article <xz_si.31969$,
Jean Pierre Daviau écrit:

Ici je crois que la norme veut une constante?
char tampon[fgets(tampon, sizeof(tampon), stdin)];
??


Rien à voir avec une taille constante. Il faut évidemment que la
taille soit connue *avant* l'appel de fgets! Donc aucun langage
ne permettra de faire ce que tu écris ci-dessus (ou alors il faut
que ce soit la fonction qui réserve la mémoire). C'est juste une
question de logique...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Jean Pierre Daviau
Merci.


On ne peur pas connaître d'avance la taille de STDIN? Il n'y a
pas de sizeof(stdin)?

Alors là, il n'y a qu'à réouvrir un fichier.


"Vincent Lefevre" <vincent+ a écrit dans le
message de news: 20070804172939$
Dans l'article <xz_si.31969$,
Jean Pierre Daviau écrit:

Ici je crois que la norme veut une constante?
char tampon[fgets(tampon, sizeof(tampon), stdin)];
??


Rien à voir avec une taille constante. Il faut évidemment que
la
taille soit connue *avant* l'appel de fgets! Donc aucun langage
ne permettra de faire ce que tu écris ci-dessus (ou alors il
faut
que ce soit la fonction qui réserve la mémoire). C'est juste
une
question de logique...

--
Vincent Lefèvre - Web:
<http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog:
<http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP,
ENS-Lyon)



Avatar
Vincent Lefevre
Dans l'article <SSiti.463$,
Jean Pierre Daviau écrit:

On ne peur pas connaître d'avance la taille de STDIN?


stdin n'a pas de taille a priori: c'est un flux potentiellement
infini. Et même une fois stdin fermé, comme ce n'est pas un fichier
normal (enfin, pas forcément), le seul moyen de connaître sa taille
est de le lire. Mais quand on le lit, on perd toutes les données non
stockées. Donc si tu veux stocker les données de stdin, tu dois le
faire sans connaître sa taille.

Il n'y a pas de sizeof(stdin)?


stdin est juste un pointeur sur une structure de données (qui contient
les infos pour lire le fichier, mais pas le contenu du fichier...
surtout si le fichier est un flux infini[*]). sizeof(stdin) va donc
te renvoyer une valeur style 4 ou 8. Pour connaître la taille d'un
fichier, il faut utiliser des fonctions comme fseek, mais justement,
fseek ne marche pas sur tous les fichiers.

[*] Par exemple, sous Linux, tu as /dev/zero, qui correspond à une
suite infinie d'octets nuls.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)