2012-06-19 17 views
7

मैं funcA से एक फ़ंक्शन funcB पर कॉल कर रहा हूं। funcB आउटपुट डेटा के लिए कई printf कथन का उपयोग करता है। क्या funcA के माध्यम से उस डेटा को कैप्चर करने का कोई तरीका है? मैं funcB को संशोधित नहीं कर सकता।printf के आउटपुट कैप्चर कैसे करें?

funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

funcA(){ 
    funcB(); 
} 
+2

क्या होगा यदि 'funcB' इसके आउटपुट को प्रिंट नहीं करेगा, बल्कि इसे' funcA' पर वापस कर देगा? आपके द्वारा प्रदान किए गए सार विवरण से कठिन कहना, अधिक विशिष्ट होना चाहिए। – LihO

+2

* "यह एक सी ++ प्रश्न है" * - यह मुझे एक सी सवाल की तरह दिखता है। यदि यह सी ++ था तो आप ऐसा कुछ कर सकते थे: [यह] (http://stackoverflow.com/a/8076948/168175)। – Flexo

+0

यह मेरे उत्तर में उल्लिखित एक ओएस-specfic सवाल की तरह दिखता है। –

उत्तर

10

यह उत्तर पॉज़िक्स केंद्रित है। फ़ाइल में stdout को रीडायरेक्ट करने के लिए आप freopen का उपयोग कर सकते हैं। लेकिन, आप dupSTDOUT_FILENO ऐसा करने से पहले को अपने मूल स्थिति के समान fdopen पर पुनर्स्थापित कर सकते हैं।

int stdout_fd = dup(STDOUT_FILENO); 
freopen(redirected_filename, "w", stdout); 
funcB(); 
fclose(stdout); 
dup2(stdout_fd, STDOUT_FILENO); 
stdout = fdopen(STDOUT_FILENO, "w"); 
close(stdout_fd); 

सी ++ धाराओं के लिए, आप Johnathan Wakely's answer का उपयोग कर सकते हैं।

+0

आप दोस्त पर शासन करते हैं, यह काम करता है! – Gene

0

एक अलग कार्यक्रम में funcB रखो। फिर आप इसके मानक आउटपुट को कैप्चर कर सकते हैं, उदा। पाइपिंग या इसे फ़ाइल में रीडायरेक्ट करके। यह कैसे करें आमतौर पर ओएस पर निर्भर करता है और सी ++ के दायरे से बाहर है।

वैकल्पिक रूप से, हो सकता है कि आप अपनी funcA प्रक्रिया 'मानक आउटपुट को फ़ाइल में रीडायरेक्ट कर सकें, फिर FuncB पर कॉल करें, और फ़ाइल से आउटपुट पुनर्प्राप्त करें।

फिर से, यह कैसे करें C++ के दायरे से बाहर है और ओएस पर निर्भर करता है।

1

यदि आपके प्रोग्राम में कुछ भी नहीं है printf का उपयोग करता है, तो आप अपना खुद का संस्करण लिख सकते हैं और इसे स्पष्ट रूप से लिंक कर सकते हैं। यदि फ़ंक्शन पहले ही परिभाषित किया गया है तो लिंकर मानक लाइब्रेरी में नहीं दिखेगा। आप कार्यान्वयन के लिए शायद vsprintf का उपयोग कर सकते हैं, या आपके कंपाइलर द्वारा प्रदान की जाने वाली ओवररन जांच के साथ कुछ सुरक्षित संस्करण का उपयोग कर सकते हैं।

1

आप printf पर interposing एक गंदा खेल आप 'चोरी' कर सकते हैं खेलने के लिए तैयार हैं, तो इसके उत्पादन की तरह कुछ कर रही है: आप एक झंडा इस्तेमाल कर सकते हैं

#include <stdio.h> 
#include <stdarg.h> 

static char buffer[1024]; 
static char *next = buffer; 

static void funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

static void funcA(){ 
    funcB(); 
    // Do stuff iwth buffer here 
    fprintf(stderr, "stole: %s\n", buffer); 
    next=buffer; // reset for later. 
} 

int main() { 
    funcA(); 
} 


int printf(const char *fmt, ...) { 
    va_list argp; 
    va_start(argp, fmt); 
    const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp); 
    next += ret; 
    va_end(argp); 
    return ret; 
} 

दर्शाने के लिए जिन मामलों में आप चाहते हैं को संभालने के लिए सामान्य के रूप में काम करने के लिए printf। (उदा। इसे fprintf पर मानचित्र करें या वास्तविक कॉल खोजने के लिए dlsym()/समान का उपयोग करें)।

आप बफर के आकार को अधिक समझदारी से प्रबंधित करने के लिए realloc का भी उपयोग कर सकते हैं।

संबंधित मुद्दे