2012-06-19 6 views
7

Ich rufe eine Funktion funcB von funcA. funcB verwendet mehrere printf Anweisungen, um Daten auszugeben. Gibt es eine Möglichkeit für mich, diese Daten über funcA zu erfassen? Ich kann funcB nicht ändern.Wie erfasst man die Ausgabe von printf?

funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

funcA(){ 
    funcB(); 
} 
+2

Was wäre, wenn 'funcB' nicht seine Ausgabe ausgibt, sondern stattdessen' funcA' zurückgibt? Schwer zu sagen von der abstrakten Beschreibung, wie Sie angegeben haben, genauer zu sein. – LihO

+2

* "Dies ist eine C++ Frage" * - es sieht eher wie eine C Frage aus. Wenn es C++ wäre, könntest du so etwas machen wie: [this] (http://stackoverflow.com/a/8076948/168175). – Flexo

+0

Es sieht eher wie eine OS-spezifische Frage für mich aus, wie in meiner Antwort angedeutet. –

Antwort

10

Diese Antwort ist POSIX zentrisch. Sie können freopen verwenden, um stdout in eine Datei umzuleiten. Aber Sie werden dup die STDOUT_FILENO bevor Sie das tun möchten, so können Sie stdout zu etwas ähnlich dem ursprünglichen Zustand mit fdopen wiederherstellen.

int stdout_fd = dup(STDOUT_FILENO); 
freopen(redirected_filename, "w", stdout); 
funcB(); 
fclose(stdout); 
dup2(stdout_fd, STDOUT_FILENO); 
stdout = fdopen(STDOUT_FILENO, "w"); 
close(stdout_fd); 

Für C++ - Streams können Sie Johnathan Wakely's answer verwenden.

+0

Sie herrschen, es hat funktioniert! – Gene

0

Setzen Sie funcB in einem separaten Programm. Sie können dann seine Standardausgabe, z.B. durch Piping oder durch Umleiten in eine Datei. Wie dies zu tun ist, hängt im Allgemeinen vom Betriebssystem ab und liegt außerhalb von C++.

Alternativ können Sie Ihre funcA Prozess-Standardausgabe in eine Datei umleiten, dann FuncB aufrufen und die Ausgabe aus der Datei abrufen.

Noch einmal, wie dies zu tun ist, ist außerhalb des Bereichs von C++ und hängt vom Betriebssystem ab.

1

Wenn nichts anderes in Ihrem Programm printf verwendet, können Sie Ihre eigene Version schreiben und explizit verlinken. Der Linker wird nicht in der Standardbibliothek suchen, wenn die Funktion bereits definiert ist. Sie können wahrscheinlich vsprintf für die Implementierung oder eine sicherere Version mit Überlaufprüfung verwenden, wenn es von Ihrem Compiler bereitgestellt wird.

1

Wenn Sie bereit sind, ein schmutziges Spiel auf printf Zwischen spielen möchten, können Sie ‚stehlen‘ seinen Ausgang so etwas wie tun:

#include <stdio.h> 
#include <stdarg.h> 

static char buffer[1024]; 
static char *next = buffer; 

static void funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

static void funcA(){ 
    funcB(); 
    // Do stuff iwth buffer here 
    fprintf(stderr, "stole: %s\n", buffer); 
    next=buffer; // reset for later. 
} 

int main() { 
    funcA(); 
} 


int printf(const char *fmt, ...) { 
    va_list argp; 
    va_start(argp, fmt); 
    const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp); 
    next += ret; 
    va_end(argp); 
    return ret; 
} 

Sie ein Flag verwenden könnte, um anzuzeigen, wie die Instanzen zu handhaben, wo Sie wollen printf funktioniert normal. (Z. B. map es auf fprintf oder verwenden Sie dlsym()/ähnlich, um den echten Anruf zu finden).

Sie könnten auch realloc verwenden, um die Größe des Puffers vernünftiger zu verwalten.

Verwandte Themen