77 votes

Reroutage de stdin et stdout de C

Je veux rouvrir le stdin y stdout (et peut-être stderr tant que j'y suis) les manipulations de fichiers, de sorte que les futurs appels à printf() o putchar() o puts() ira dans un fichier, et les futurs appels à getc() et autres viendront d'un fichier.

1) Je ne veux pas perdre de façon permanente les entrées/sorties/erreurs standard. Je peux vouloir les réutiliser plus tard dans le programme.

2) Je ne veux pas ouvrir de nouveaux filehandles car ces filehandles devraient être souvent transmis ou globaux (frissons).

3) Je ne veux utiliser aucune open() o fork() ou d'autres fonctions dépendantes du système si je ne peux pas m'en empêcher.

Donc, en gros, est-ce que ça marche de faire ça :

stdin = fopen("newin", "r");

Et, si c'est le cas, comment puis-je obtenir la valeur originale de stdin retour ? Dois-je le stocker dans un FILE * et le récupérer plus tard ?

1 votes

Notez que stdin , stdout y stderr sont des variables globales.

3voto

Norman Ramsey Points 115730

freopen résout la partie facile. Conserver l'ancien stdin n'est pas difficile si vous n'avez rien lu et si vous êtes prêt à utiliser des appels système POSIX comme dup o dup2 . Si vous vous mettez à le lire, les jeux sont faits.

Peut-être pouvez-vous nous indiquer le contexte dans lequel ce problème se produit ?

Je t'encourage à t'en tenir à des situations où tu es prêt à abandonner de vieilles stdin y stdout et peut donc utiliser freopen .

2voto

john Points 21

En attendant, il existe une bibliothèque en code source C qui fera tout cela pour vous, en redirigeant stdout ou stderr. Mais ce qui est génial, c'est qu'elle vous permet d'assigner autant de fonctions de rappel que vous le souhaitez aux flux interceptés, ce qui vous permet ensuite d'envoyer très facilement un seul message à plusieurs destinations, une base de données, un fichier texte, etc.

En plus de cela, il est trivial de créer de nouveaux flux qui ont la même apparence et le même comportement que stdout et stderr, et vous pouvez également rediriger ces nouveaux flux vers plusieurs emplacements.

cherchez la bibliothèque C de U-Streams sur *oogle.

0voto

afr0ck Points 12

C'est le moyen le plus facilement disponible, le plus pratique et le plus utile pour faire

freopen("dir","r",stdin);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X