2017-04-19 17 views
5

मेरे अधिकांश जीवन के लिए, मैं cstdio का उपयोग कर रहा हूं। अब मैं iostream पर स्थानांतरित करने की कोशिश कर रहा हूं।रन .exe और stdin को रीडायरेक्ट करें और

मान लीजिए मैं "foo.cpp" नामक एक अलग कार्यक्रम है कि इस तरह दिखता है:

int main(){ // foo.cpp 
    int x; 
    std::cin >> x; 
    std::cout << x + 5 << "\n"; 
} 

"bar.cpp" कहा जाता है एक अन्य कार्यक्रम में, मैं foo निष्पादन कहते हैं। अतीत में, अगर मैं एक फाइल करने के लिए stdin और stdout अनुप्रेषित करना चाहता था, मैं freopen तो तरह का प्रयोग करेंगे:

int main(){ // bar.cpp, redirecting stdin and stdout 
    freopen("foo.in", "r", stdin); // Suppose "foo.in" contains a single integer "42" 
    freopen("foo.out", "w", stdout); 

    system("foo.exe"); // "foo.out" will contain "47" 
} 

अब मैं std::cin और std::cout stringstreams पर रीडायरेक्ट करने की कोशिश कर रहा हूँ। कुछ इस तरह:

int main(){ // bar.cpp, redirecting cin and cout 
    std::istringstream instr("62"); 
    std::ostringstream outstr; 

    std::cin.rdbuf(instr.rdbuf()); 
    std::cout.rdbuf(outstr.rdbuf()); 

    system("foo.exe"); // outstr should contain "67" 
} 

लेकिन क्या मैंने सीखा है कि std::cin और std::cout जब "foo.exe" को क्रियान्वित करने पुन: निर्देशित नहीं किया गया है। कार्यक्रम अब उपयोगकर्ता इनपुट की उम्मीद है और std::cout पर प्रिंट करेगा। जब "foo.exe" निष्पादित किया गया था, std::cin और std::cout "bar.cpp" के भीतर क्रमशः instr और outstr पर रीडायरेक्ट किया गया।

मेरा सवाल है, क्या iostream के साथ ऐसा करने का कोई तरीका है जैसा कि मैंने इरादा किया है, या मैं freopen का उपयोग कर अटक गया हूं?

+1

ऑपरेटिंग सिस्टम निष्पादन योग्य के आउटपुट को संसाधित करने का प्रभारी है। सी ++ भाषा में आउटपुट रीडायरेक्ट करने के लिए कोई सुविधा नहीं है। –

+1

प्रोग्राम्स के बीच डेटा साझा करने के लिए सामान्य समाधान: फ़ाइलें, सॉकेट, पाइपिंग (अपने प्रोग्राम के लिए मानक इनपुट में अन्य प्रोग्राम के पाइप आउटपुट के लिए ओएस को बताएं), साझा स्मृति क्षेत्र। इंटरनेट खोजें। –

+1

क्या आपने वही फ्रीपैन कॉल करने की कोशिश की है? – stark

उत्तर

1

कुछ समय में freopen कॉल नहीं देखा है। यह कुछ पुरानी यादें वापस लाता है।

वैसे भी, मुझे लगता है कि आपको freopen के साथ रहना चाहिए। समारोह के documentation पेज सचमुच कहा गया है कि इस मुख्य उपयोग के मामलों में से एक है:

इस समारोह stdin, stdout और stderr विशिष्ट फ़ाइलों की तरह पूर्वनिर्धारित धाराओं रीडायरेक्ट करने के लिए विशेष रूप से उपयोगी है।

मुझे नहीं लगता क्योंकि iostream पुस्तकालय freopen समारोह के लिए एक समान नहीं है आप केवल iostream साथ पुनर्निर्देशन कर सकते हैं, करते हैं।

यह दिलचस्प है, हालांकि यह क्यों समाधान करने की कोशिश की काम नहीं करता:

std::cin.rdbuf(instr.rdbuf()); 
std::cout.rdbuf(outstr.rdbuf()); 

हो सकता है कि उन दो लाइनों के साथ आप सिर्फ rdbuf std::cin की और std::cout मौजूदा प्रक्रिया से प्रभावित करते हैं और उपप्रक्रिया एक और है std::cin और std::cout का उदाहरण।

system पर कॉल करते समय फ़ाइलों के बारे में जानकारी को मूल प्रक्रिया से उपप्रोसेसर में कॉपी किया जा रहा है। यही कारण है कि stdin और stdout पर freopen के साथ मुख्य प्रक्रिया में किए गए परिवर्तन उपप्रोसेसर में भी दिखाई देते हैं।

भले ही, you should not use system आपके मुख्य सी ++ प्रोग्राम से उपप्रोग्राम चलाने के लिए।जैसा कि आप शायद विंडोज़ पर हैं (foo.exe से अनुमान लगा रहे हैं), मैं माइक्रोसॉफ्ट से इस example का विश्लेषण करूंगा। यह बताता है कि सबप्रोग्राम बनाने और उपप्रोग्राम के इनपुट और आउटपुट को रीडायरेक्ट करने के लिए पाइप का उपयोग कैसे करें।

0

फ्रीपेन का उपयोग करके अपने नमूना कोड में, आप भौतिक फाइलों पर/से रीडायरेक्ट कर रहे हैं, सही? Std :: istringstream और std :: ostringstream का उपयोग करके अपने नमूना कोड में आप स्मृति से/रीडायरेक्ट करने की कोशिश कर रहे हैं, सही? भौतिक फाइलें स्मृति के समान नहीं हैं। मेमोरी में फाइल डिस्क्रिप्टर नहीं हैं। लिनक्स में आप windows - C - create file in memory - Stack Overflow में fmemopen का उपयोग कर सकते हैं, लेकिन यह सी ++ मानक कक्षाओं जैसे std :: istringstream और std :: ostringstream के साथ मदद नहीं करेगा और न ही आप fmemopen से/fmemopen से stdin और stdout को रीडायरेक्ट करने में सक्षम होंगे क्योंकि fmemopen सभी ऑपरेटिंग सिस्टम में उपलब्ध नहीं है। सी ++ मानक वर्ग इस प्रकार की चीज़ का समर्थन नहीं करते हैं; c++ - Getting a FILE* from a std::fstream - Stack Overflow देखें। std :: istream और std :: ostream cd+ istringstream और std :: ostringstream की तरह दिख सकता है C++ इंटरैस स्तर पर लेकिन आंतरिक रूप से वे संगत नहीं हैं।

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