stdout
genel değişkenini bar();
'dan önce kaydedebilir, ardından /dev/null
olarak ayarlayabilir ve geri yükleyebilirsiniz. Kod örneği;
#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;
}
İşletim sistemi X'de test edildi, Windows hakkında emin değil.
DÜZENLEME: Sen Windows üzerinde nul
ile /dev/null
yerini alabilir. Windows altında çalışan fdopen()
ve dup()
'a gelince, bunlar benim man
sayfalarına göre POSIX.1 standardının bir parçasıdır, ancak test etmedim.
DÜZENLEME 2: çözüm Windows için işe yaramazsa, Yorum önerilen olarak, this SO answer başka öneri var.
DÜZENLEME 3: Bunu yapmak için standart, uyumlu ve platformlar arası bir yol daha uzundır. basması stdout'u geçmeden önce basılmış (1) şey gerçekten ekrana yazdırılır emin olmak için gereklidir ve oldu (2) hiçbir şey vardır
#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;
}
(kod adı geçen SO soru uyarlanan ve _dup için Microsoft'un belgeler) stdout'u konsola (veya boruya) geri çevirmeden önce yazdırılır.
Unix tabanlı sistemler (Linux, Mac OS X) altında çalışılabilir. Pencereler dünyasında "/ dev/null" gibi dosya yollarının bulunması mümkün olmadığından Windows altında çalışmaz. –
"/ dev/null" ın kolay kısım olduğuna inanıyorum. Düzenlememe bak. – user1071136
“Fdopen” çağrısında yaptığınız gibi stdout'a atanabilir mi? Standart, stdout'un bir "l-değeri" olması gerektiğini belirtir mi? Bu şekilde daha iyi olurdu - http://stackoverflow.com/a/7664951/922712 – user93353