10 votes

Langage C. Lire à partir de la sortie standard (stdout)

J'ai quelques problèmes avec une fonction de la bibliothèque. Je dois écrire un code C qui utilise une fonction de bibliothèque qui affiche à l'écran ses étapes internes. Je ne suis pas intéressé par sa valeur de retour, mais seulement par les étapes imprimées. Donc, je pense que je dois lire à partir de la sortie standard et copier les chaînes lues dans un tampon. J'ai déjà essayé fscanf et dup2 mais je n'arrive pas à lire depuis la sortie standard. Quelqu'un peut-il m'aider ?

16voto

Linas Points 489

Une version étendue de la réponse précédente, sans utiliser de fichiers, et en capturant stdout dans un tuyau, à la place :

#include <stdio.h>
#include <unistd.h>

main()
{
   int  stdout_bk; //is fd for stdout backup

   printf("this is before redirection\n");
   stdout_bk = dup(fileno(stdout));

   int pipefd[2];
   pipe2(pipefd, 0); // O_NONBLOCK);

   // What used to be stdout will now go to the pipe.
   dup2(pipefd[1], fileno(stdout));

   printf("this is printed much later!\n");
   fflush(stdout);//flushall();
   write(pipefd[1], "good-bye", 9); // null-terminated string!
   close(pipefd[1]);

   dup2(stdout_bk, fileno(stdout));//restore
   printf("this is now\n");

   char buf[101];
   read(pipefd[0], buf, 100); 
   printf("got this from the pipe >>>%s<<<\n", buf);
}

Génère la sortie suivante :

this is before redirection
this is now
got this from the pipe >>>this is printed much later!
good-bye<<<

6voto

Paul Rubel Points 13132

Vous devriez être en mesure d'ouvrir un tuyau, de dupliquer l'extrémité de l'écriture dans stdout et de lire à partir de l'extrémité de la lecture du tuyau, quelque chose comme ce qui suit, avec un contrôle d'erreur :

int fds[2];
pipe(fds);
dup2(fds[1], stdout);
read(fds[0], buf, buf_sz);

1voto

BLUEPIXY Points 18514
    FILE *fp;
    int  stdout_bk;//is fd for stdout backup

    stdout_bk = dup(fileno(stdout));
    fp=fopen("temp.txt","w");//file out, after read from file
    dup2(fileno(fp), fileno(stdout));
    /* ... */
    fflush(stdout);//flushall();
    fclose(fp);

    dup2(stdout_bk, fileno(stdout));//restore

0voto

Je suppose que vous voulez parler de l'entrée standard. Une autre fonction possible est gets , utiliser man gets pour comprendre son fonctionnement (assez simple). Veuillez montrer votre code et expliquer où vous avez échoué pour une meilleure réponse.

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