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.
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. –
Ich glaube, das '/ dev/null' ist der einfache Teil. Siehe meine Bearbeitung. – user1071136
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