7
votes

Comment capturer la production de printf?

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();
}


3 commentaires

Et si FUNCB n'imprimerait pas sa sortie, mais le renvoie à Funca à la place? Difficile de dire de la description abstraite comme vous l'avez fournie, soyez plus précis.


"Ceci est une question C ++" - 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.


4 Réponses :


0
votes

Mettez Funcb 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 ++.

Alternativement, vous pouvez peut-être rediriger votre sortie standard FunCA processus à un fichier, puis appelez Funcb et récupérez la sortie du fichier.

Encore une fois, comment faire est en dehors du domaine de C ++ et dépend du système d'exploitation.


0 commentaires

2
votes

Si rien d'autre dans votre programme n'utilise printf , 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 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.


0 commentaires

14
votes

(Cette réponse est une version corrigée basée sur Cette réponse .)

Cette réponse est POSIX CENTRIC. Utilisez Ouvrir pour créer un descripteur de fichier pour le fichier que vous souhaitez rediriger vers. Ensuite, utilisez DUP2 à stdout_fileno pour modifier stdout pour écrire au fichier à la place. Mais, vous voudrez DUP THE STDOUT_FILENO Avant de le faire, vous pouvez donc restaurer stdout avec un autre DUP2 . xxx

si funcb utilise std :: cout , utilisez std :: cout.flush () au lieu de fflush (stdout) .

Si vous souhaitez manipuler des flux C ++ plus directement, vous pouvez utiliser La réponse de Johnathan Wakely .


10 commentaires

Comment revenir à l'écran de revenir à l'écran?


J'ai annexé cout << "devrait aller" << endl; printf ("à nouveau normal \ n"); après Fermer (stdout_fd); 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) et cout.flush () .


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 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.



1
votes

Si vous êtes prêt à jouer à un jeu sale interposant sur printf vous pouvez "voler" sa sortie faisant quelque chose comme: xxx

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 fprintf ou utiliser dlsym () / similaire pour trouver l'appel réel).

Vous pouvez également utiliser realloc < / code> pour gérer la taille du tampon plus sensiblement.


0 commentaires