2012-11-21 14 views
13

Ich möchte bar() in foo(), bar() aufrufen werden einige globale Variablen Werte ändern (das ist, was ich will), aber unterdessen produzieren einige Ausgabe (ich will nicht jede Ausgabe);C - Wie unterdrückt man die Ausgabe einer Unterfunktion?

void foo() 
{ 
    //I have tried: 
    //system("1>&/dev/null") and of course this won't work 
    bar(); 
} 

Was kann ich tun bar() ‚s Ausgabe zu unterdrücken?

Antwort

14

Sie können die globale Variable stdout vor bar(); speichern, dann auf /dev/null setzen und dann wiederherstellen. Codebeispiel;

#include <stdio.h> 

int main() { 
    int old_stdout = dup(1); 

    freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null" 
    printf("asd1"); 
    fclose(stdout); 

    stdout = fdopen(old_stdout, "w"); 
    printf("asd2"); 
    return 0; 
} 

Getestet auf OS X, nicht sicher über Windows.

EDIT: Sie können /dev/null mit nul unter Windows ersetzen. Wie für die fdopen() und dup() arbeiten unter Windows - sie sind Teil des POSIX.1-Standards nach meinen man Seiten, aber ich habe es nicht getestet.

EDIT 2: Wie in den Kommentaren empfohlen, wenn die Lösung nicht für Windows funktioniert, gibt es einen anderen Vorschlag in this SO answer.

EDIT 3: Eine längere, aber standardkonforme und plattformübergreifende Möglichkeit, dies zu tun, ist wie folgt. (Code aus erwähnte Frage SO angepasst und die Dokumentation von Microsoft für _dup)

#include <stdio.h> 

#ifdef _WIN32 
#include <io.h> 
char * const nulFileName = "NUL"; 
#define CROSS_DUP(fd) _dup(fd) 
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd) 
#else 
#include <unistd.h> 
char * const nulFileName = "/dev/null"; 
#define CROSS_DUP(fd) dup(fd) 
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd) 
#endif 

int main() { 
    int stdoutBackupFd; 
    FILE *nullOut; 
    /* duplicate stdout */ 
    stdoutBackupFd = CROSS_DUP(STDOUT_FILENO); 

    fflush(stdout); 
    nullOut = fopen(nulFileName, "w"); 
    CROSS_DUP2(fileno(nullOut), STDOUT_FILENO); 

    printf("asd1\n"); 
    fflush(stdout); 
    fclose(nullOut); 

    // Restore stdout 
    CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO); 
    close(stdoutBackupFd); 

    printf("asd2\n"); 

    return 0; 
} 

Die Wallungen sind erforderlich, um sicherzustellen, dass (1) etwas gedruckt vor stdout Umschalten in der Tat auf Bildschirm gedruckt wird, und (2) nichts, das war gedruckt vor dem Zurückschalten stdout auf Konsole (oder Rohr) gedruckt wird.

+1

Könnte unter Unix-basierten Systemen arbeiten (Linux, Mac OS X). Funktioniert nie unter Windows, da in der Windows-Welt Dateipfade wie "/ dev/null" nicht möglich sind. –

+0

Ich glaube, das '/ dev/null' ist der einfache Teil. Siehe meine Bearbeitung. – user1071136

+0

Kann 'stdout' wie beim' fdopen'-Aufruf zugewiesen werden? Gibt der Standard an, dass stdout ein "l-Wert" sein muss? Wäre besser, es so zu machen - http://Stackoverflow.com/a/7764951/922712 – user93353

Verwandte Themen