आप वैश्विक चर stdout
bar();
से पहले सहेज सकते हैं, फिर इसे /dev/null
पर सेट करें, फिर इसे पुनर्स्थापित करें। कोड उदाहरण;
#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;
}
ओएस एक्स पर परीक्षण किया गया, विंडोज के बारे में निश्चित नहीं है।
संपादित करें: आप /dev/null
को nul
विंडोज़ पर प्रतिस्थापित कर सकते हैं। fdopen()
और dup()
विंडोज के तहत काम करने के लिए - वे मेरे man
पृष्ठों के अनुसार POSIX.1 मानक का हिस्सा हैं, लेकिन मैंने इसका परीक्षण नहीं किया है।
संपादित करें 2: टिप्पणियों में सुझाव दिया गया है कि यदि समाधान विंडोज के लिए काम नहीं करता है, तो this SO answer में एक और सुझाव है।
संपादित करें 3: एक लंबा, हालांकि मानक अनुपालन और ऐसा करने के लिए क्रॉस-प्लेटफ़ॉर्म तरीका निम्नानुसार है। (कोड का उल्लेख किया तो सवाल से अनुकूलित, और _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;
}
flushes सुनिश्चित करने के लिए आवश्यक हैं कि (1) कुछ भी stdout स्विच करने से पहले मुद्रित वास्तव में स्क्रीन पर छपा है, और (2) कुछ भी नहीं था कि कंसोल (या पाइप) पर वापस stdout स्विच करने से पहले मुद्रित मुद्रित है।
यूनिक्स आधारित सिस्टम (लिनक्स, मैक ओएस एक्स) के तहत काम कर सकता है। विंडोज़ के तहत कभी काम नहीं करेगा, क्योंकि विंडोज़ वर्ल्ड फाइल पथ जैसे "/ dev/null" में संभव नहीं है। –
मेरा मानना है कि '/ dev/null' आसान हिस्सा है। मेरा संपादन देखें। – user1071136
क्या 'stdout' को' fdopen' कॉल में करने के तरीके को असाइन किया जा सकता है? क्या मानक निर्दिष्ट करता है कि stdout को 'एल-वैल्यू' होना चाहिए? इस तरह से ऐसा करना बेहतर होगा - http://stackoverflow.com/a/7664951/922712 – user93353