2011-07-01 8 views
5

के साथ एक सी प्रोग्राम से जावा में मानक आउटपुट प्राप्त करने में समस्या मुझे जावा से एक सी प्रोग्राम कॉल करने और मानक आउटपुट कैप्चर करने का प्रयास कर रहा है।getchar()

try { 
    ProcessBuilder pb = new ProcessBuilder("helloworld.exe"); 
    pb.redirectErrorStream(true); // Merge std out and std err into same stream 
    program = pb.start();   // Start program 

    BufferedReader input = new BufferedReader(new InputStreamReader(program.getInputStream())); 

    line = input.readLine(); 
    while (line != null) { 
     System.out.println(line); 
     line = input.readLine(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

यहां एक नमूना ग कार्यक्रम है::

int main(){ 
    printf("Hello world\n"); 
} 

यह ठीक काम करता है जब कार्यक्रम मैं (इस मामले में HelloWorld) को क्रियान्वित कर रहा हूँ उस में एक getchar() नहीं है यहाँ मेरी कोड है। हालांकि, अगर मैं printf के ठीक बाद getchar() जोड़ता हूं, तो मुझे इनपुट स्ट्रीम से कुछ भी नहीं मिलता है। कोई विचार क्यों?

धन्यवाद

+1

थोड़ी देर के लिए सी के साथ काम नहीं किया है, लेकिन आप प्रिंट – Kyle

+0

प्रिंट के बाद आउटपुट स्ट्रीम को फ्लश करने का प्रयास कर सकते हैं क्या आपने यह देखने के लिए अपने सी प्रोग्राम को चलाने की कोशिश की है कि यह कोई त्रुटि उत्पन्न कर रहा है या व्यवहार क्या है? –

+0

आप ऐसे प्रोग्राम में 'getchar' क्यों जोड़ेंगे जो इनपुट की आवश्यकता नहीं है? ??? – pmg

उत्तर

1

केली जैसा कि आपने कहा, आप प्रिंट बुला यकीन अक्षर वास्तव में देरी के बिना मानक आउटपुट में जाना बनाने के लिए के बाद उत्पादन धारा फ्लश करने के लिए आवश्यकता हो सकती है। आपको यह दोनों कार्यक्रमों में करना चाहिए। यह fflush(stdout); के साथ सी में किया जा सकता है और शायद जावा में System.out.flush() जैसे कुछ किया जा सकता है।

डेविड

+0

मैंने सी प्रोग्राम में printf के ठीक बाद fflush (NULL) जोड़ा और यह समस्या हल हो गई। धन्यवाद केली और डेविड। – Dan

0

जाहिर बच्चे प्रक्रिया (या ओएस या जावा रनटाइम या ..., ...) अभी भी माता-पिता की प्रक्रिया के लिए उत्पादन भेजने से पहले एक चार (getchar) के लिए प्रतीक्षा कर रहा है ।

यदि आपको इनपुट की आवश्यकता नहीं है, तो getchar शामिल न करें !!

1

क्योंकि जब सी प्रोग्राम प्रोग्राम प्राप्त करता है, तो सी प्रोग्राम इनपुट के लिए प्रतीक्षा करने के लिए बंद हो जाता है। और इनपुट कभी नहीं आता है! आखिरकार, आपका जावा प्रोग्राम stdout/stderr को कैप्चर करता है, लेकिन stdin को जोड़ने के बारे में कुछ भी नहीं करता है।

program ऑब्जेक्ट पर getOutputStream() instance method in the Process class का उपयोग करें, जो स्टडिन का प्रतिनिधित्व करने वाली स्ट्रीम प्राप्त करने के लिए, इनपुट इनपुट() के समान है।

फिर सी प्रोग्राम को सी प्रोग्राम को भेजें जो सी प्रोग्राम की अपेक्षा करता है।

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