2011-05-06 7 views
9

मैं opencv हार प्रशिक्षण समारोह (अर्थात् cvCreateTreeCascadeClassifier) ​​के आसपास लपेटो करने के लिए थोड़ा C++ अनुप्रयोग लिख रहा हूँ। फ़ंक्शन कंसोल पर आउटपुट का पूरा भार फेंकता है और मैं इस आउटपुट को पार्स करना चाहता हूं ताकि मैं अपने कोड में विभिन्न चर पॉप्युलेट कर सकूं।प्रिंटफ आउटपुट को वापस कोड में रीडायरेक्ट कैसे करें?

समारोह मैं उपयोग करना चाहते हैं वास्तविक openCV पुस्तकालय का हिस्सा नहीं है; इसके बजाय इसे परियोजना के हिस्से के रूप में मेरे कोड के साथ बनाया जाना है। समारोह से सभी आउटपुट printf के माध्यम से है।

प्रश्न: यह printf बयान अवरोधन करने से पहले वे कंसोल पर खत्म संभव है? मैंने फ्रीपैन का उपयोग करके उन्हें रीडायरेक्ट करने में कामयाब रहा है लेकिन यह थोड़ा बेकार लगता है क्योंकि मुझे फ़ाइल को पार्स करने की आवश्यकता है और फिर फ़ंक्शन कॉल समाप्त होने पर इसे हटा दें। साथ ही, यह फ़ंक्शन कई घंटों (और संभवतः यहां तक ​​कि सप्ताह भी!) तक चलने की संभावना है, इसलिए फाइल का आकार भी एक मुद्दा हो सकता है यदि इसे लगातार जोड़ा जा रहा हो।

आवश्यकताएँ: मैं इस अनुप्रयोग C++ होने के लिए और दोनों Windows और Linux पर चलाने की आवश्यकता है (लेकिन यदि आवश्यकता हुई सशर्त संकलन बयानों के साथ कोई समस्या नहीं है)। मैं कंसोल पर अभी भी अपने cout और cerr संदेशों को देखने में सक्षम होना चाहूंगा (बस printf नहीं)।

मेरे Googling मेरे जीने की इच्छाशक्ति हटा दिया गया है! क्या कोई भी कोड उदाहरण या पॉइंटर्स के माध्यम से किसी समाधान के लिए समाधान के साथ मदद कर सकता है, मुझे जवाब की तलाश करनी चाहिए?

धन्यवाद

उत्तर

7

आप क्या कर सकते है:

  • एक पाइप
  • पाइप के लिखने योग्य अंत नई stdout
  • पाइप

पढ़ना की पठनीय भाग से पढ़ कर बनाने और लेखन विभिन्न धागे में होना चाहिए या आपको जोखिम है कि आपका प्रोग्राम पाइप के एक छोर पर भूखा है।

यहां एक नमूना है कि कैसे यूनिक्स & खिड़कियों में पुनर्निर्देशन करना है:


#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
/* gcc defined unix */ 
#ifdef unix 
#include <unistd.h> 
#endif 
#ifdef WIN32 
#include <io.h> 
#define pipe(X) _pipe(X,4096,O_BINARY)  
#define fileno _fileno 
#define dup2 _dup2 
#define read _read 

#endif 
#include <assert.h> 

int main() 
{ 
    int fds[2]; 
    int res; 
    char buf[256]; 
    int so; 

    res=pipe(fds); 
    assert(res==0); 

    so=fileno(stdout); 
    // close stdout handle and make the writable part of fds the new stdout. 
    res=dup2(fds[1],so); 
    assert(res!=-1); 

    printf("Hi there\n"); 
    fflush(stdout); 
    // reading should happen in a different thread 

    res=read(fds[0],buf,sizeof(buf)-1); 
    assert(res>=0 && res<sizeof(buf)); 
    buf[res]=0; 
    fprintf(stderr,"buf=>%s\n",buf); 
    return 0; 
} 

इस कोड

buf=>Hi there 

(मैं यहाँ पर जोर उपयोग कर रहा हूँ प्रिंट चाहिए क्योंकि मैं वास्तविक त्रुटि इस उदाहरण के लिए जाँच)

करने के लिए बहुत आलसी हूँ
+0

उत्कृष्ट - यह वही है जो मुझे चाहिए था। मैंने इन सभी कार्यों के बारे में बहुत कुछ पढ़ा था, लेकिन उन उदाहरणों में से अधिकांश जहां अत्यधिक जटिल तरीके से प्रस्तुत किया गया था, जिससे उन्हें समझ में मुश्किल हो गई। आपका उदाहरण सही, छोटा और भी मुद्दा था। धन्यवाद! – john

0

अपने आवेदन के लिए एक आवेदन में lib, और पाइप आवेदन के उत्पादन समाहित। अब एक स्क्रिप्ट लिखें ताकि आपको हर बार एक पाइप के साथ ऐप्स को चलाने की आवश्यकता न हो।