2016-06-11 11 views
1

Ich möchte stdout und stderr zu einer Funktion umleiten und einen einfachen Code schreiben. fprintf ist in Ordnung, aber wenn ich printf ohne \ r, Stream an Terminal übergeben!redirect stdout/stderr in C

#include <stdio.h> 
static ssize_t file_write(void *c, const char *buf, size_t size) 
{ 
    FILE * pFile; 
    pFile = fopen ("output.txt","w"); 
    fprintf(pFile, "%s", buf); 
    fclose (pFile); 

return size; 
} 

void redirect() 
{ 
    FILE *stream; 
    stream=fopencookie(NULL, "w", (cookie_io_functions_t) {(ssize_t) 0, file_write, 0, 0}); 
    setbuf(stdout, NULL); 
    stdout = stream; 
    setbuf(stderr, NULL); 
    stderr = stream; 
} 

int main() 
{ 
    redirect(); 
    fprintf(stderr,"1-stderr test\n"); 
    fprintf(stdout, "2-stdout test\n"); 
    printf("3-printf with r test\n\r"); 
    printf("4-printf without r test\n"); 

return 0; 
} 

Datei "output.txt":

1-Stderr Test
2-stdout Test
3-printf mit r Test

Klemmenausgang:

$ ./sample
4-printf ohne r Test

+1

1. Sortieren Sie den Einzug 2. Überprüfen Sie den Rückgabewert von 'fopen' 3.' fprintf (pFile, buf); '- lassen Sie hoffen, dass' buf' kein '%' darin enthält! –

+1

Sie verwenden 'buf' als Formatzeichenfolge. Dies wird ziemlich schrecklich scheitern, wenn es '%' Zeichen enthält. Verwenden Sie 'fprintf (pFile,"% s ", buf)' oder rufen Sie 'fwrite' anstelle von' fprintf' auf. –

+0

Sie können auch 'fputs' anstelle von' fprintf' aufrufen. Das könnte am einfachsten sein. –

Antwort

1

Sie können nicht "redirect" Standardeingabe aus, oder Standardausgabe in eine Funktion in Ihrem Programm.

Sie können jedoch ein Pipe-Paar erstellen und die Standardeingabe und -ausgabe durch diese Pipes ersetzen. Eine andere Funktion (möglicherweise in einem anderen Thread oder sogar einem untergeordneten Prozess) verwendet das andere Ende der Pipes, um mit der Funktion zu kommunizieren.

Sie können natürlich z.B. setvbuf, um die Puffer von stdin und stdout zu einem Pufferpaar, das Sie bereitstellen, zu ändern, dann können Sie direkt von den Puffern wie jeder andere Speicherpuffer (d. H. Array) lesen oder direkt schreiben. Nicht, dass ich es empfehle, aber es ist gebrechlich und anfällig für Fehler.

Aber in diesem Fall scheint es, als was Sie wollen, dass alle Schreiben an stdout sollte in die Datei gehen. In diesem Fall (wie bei der Verwendung von Pipes) gibt es keine standardmäßige C-Methode, um sie zu handhaben, aber Sie müssen betriebssystemspezifische Funktionen verwenden. Wenn Sie sich auf einer POSIX-Plattform (wie Linux oder OSX) befinden, können Sie das Betriebssystem anweisen, den zugrunde liegenden Dateideskriptor für Ihre Datei zu duplizieren, und sagen, dass STDOUT_FILNO (das ist der für stdout verwendete Dateideskriptor) ein Duplikat ist Dateideskriptor der geöffneten Datei. Dann werden alle Schreibvorgänge in stdout in Ihre Datei geschrieben. Dazu müssen Sie the dup2 system call verwenden.