J'appelle une fonction Funcb code> à partir de Funca code>.
FUNCB CODE> Utilise plusieurs Printf code> des instructions sur les données de sortie.
Y a-t-il un moyen pour moi de capturer ces données via Funca code>?
Je ne peux pas modifier Funcb code>. funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
funcA(){
funcB();
}
4 Réponses :
Mettez Alternativement, vous pouvez peut-être rediriger votre sortie standard code> FunCA code> processus à un fichier, puis appelez Encore une fois, comment faire est en dehors du domaine de C ++ et dépend du système d'exploitation. P> Funcb code> dans un programme séparé. Vous pouvez ensuite capturer sa sortie standard, par ex. par la tuyauterie ou en la redirigeant dans un fichier. Comment faire cela dépend généralement du système d'exploitation et est en dehors du domaine de C ++. P>
Funcb code> et récupérez la sortie du fichier. P>
Si rien d'autre dans votre programme n'utilise printf code>, vous pouvez écrire votre propre version et le lier explicitement. La liaison ne regarde pas dans la bibliothèque standard si la fonction est déjà définie. Vous pouvez probablement utiliser vsprintf code> pour la mise en œuvre, ou une version plus sûre avec la vérification dépassée si elle est fournie par votre compilateur. P>
(Cette réponse est une version corrigée basée sur Cette réponse .)
Cette réponse est POSIX CENTRIC. Utilisez si Si vous souhaitez manipuler des flux C ++ plus directement, vous pouvez utiliser La réponse de Johnathan Wakely . p> p> Ouvrir code> pour créer un descripteur de fichier pour le fichier que vous souhaitez rediriger vers. Ensuite, utilisez DUP2 code> à stdout_fileno code> pour modifier stdout code> pour écrire au fichier à la place. Mais, vous voudrez DUP CODE> THE STDOUT_FILENO CODE> Avant de le faire, vous pouvez donc restaurer stdout code> avec un autre DUP2 code >. p> funcb code> utilise std :: cout code>, utilisez std :: cout.flush () code> au lieu de fflush (stdout) code>. p>
Comment revenir à l'écran de revenir à l'écran?
J'ai annexé cout << "devrait aller" << endl; printf ("à nouveau normal \ n"); code> après Fermer (stdout_fd); code> Mais je ne vois pas cette sortie à l'écran, ni dans "redirection_filename.txt".
@Viesteurs Vous devrez peut-être ajuster la discipline de rinçage de ligne, mais la sortie devrait exister si vous le rincez manuellement. Sinon, je m'attends à ce que le code que vous testez soit gâché quelque chose.
Comment faire la ligne de rinçage?
fflush (stdout) code> et cout.flush () code>.
Cela n'a pas aidé
@Viesteurs: Comme je l'ai dit, je m'attends à ce que le code que vous testez a gâché quelque chose. Envisagez de poster une nouvelle question.
Je suis banni pour poser des questions ici.
@JXH: J'ai le même problème @viesTurs. Malgré l'utilisation d'un rinçage correct, stdout code> n'est pas restauré pour moi et l'impression à celle-ci n'allait pas sur la console ou le fichier redirigé. GCC 8.3.0 (ou 6.5.0) et GLIBC 2.29. Comme vous lui avez demandé de faire, avez posté une nouvelle question ici: (avec le code complet) Stackoverflow.com/Questtions/56097917/...
@ user1902689: merci pour cela. La réponse de R. m'a été très éclairée.
Si vous êtes prêt à jouer à un jeu sale interposant sur Vous pouvez utiliser un drapeau Pour indiquer comment gérer les instances où vous souhaitez que PrintF fonctionne comme normale. (Par exemple, mappez-la sur Vous pouvez également utiliser printf code> vous pouvez "voler" sa sortie faisant quelque chose comme: fprintf code> ou utiliser dlsym () code> / similaire pour trouver l'appel réel). P> realloc < / code> pour gérer la taille du tampon plus sensiblement. p> p>
Et si
FUNCB code> n'imprimerait pas sa sortie, mais le renvoie àFunca code> à la place? Difficile de dire de la description abstraite comme vous l'avez fournie, soyez plus précis."Ceci est une question C ++" i> - Cela ressemble plus à une question C de c. Si c'était C ++, vous pouvez faire quelque chose comme: Ce .
Cela ressemble davantage à une question spécifique au système d'exploitation pour moi, comme mentionné dans ma réponse.