2011-08-14 14 views
7

में मैं निम्नलिखित बैच स्क्रिप्ट हैपढ़ें कार्यक्रम STDIN डेल्फी

और कार्यक्रम इस स्रोत (कम या ज्यादा) है:

procedure TForm1.FormCreate(Sender: TObject); 
var buff: String; 
begin 
    Read(buff); 
    Memo1.Lines.Text:=buff; 
end; 

और ज्ञापन में उत्पादन होता है:

ड्राइव सी में वॉल्यूम में कोई लेबल नहीं है।

मैंने कोशिश की:

  • एक शर्त के रूप eof के साथ एक पाश में पढ़ने हिस्सा डाल - किसी भी तरह अनंत लूप
  • एक पाश लेखन पढ़ने रखने के लिए जब तक strlen(buff) 0 है पैदा कर रहा है - यह बाहर निकल जाता है कुछ कारणों के लिए दूसरी बार
  • कभी भी 0.5 सेकंड पढ़ने वाली सामग्री (मैं एसिंक्रोनस स्टडीन को लिखने के बारे में सोच रहा था), यह असफल रहा

वैसे, कार्यक्रम सीधे चल रहा है, stdin डेटा के बिना, एक EInputOutput अपवाद (आई/ओ त्रुटि) कोड का कारण बनता है 6.

उत्तर

10

जीयूआई एप्लिकेशन डॉन 'का उपयोग करके देखें टी में एक stdin, stdout या stderr स्वचालित रूप से असाइन किया गया है। आप की तरह कुछ कर सकते हैं:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    Buffer: array[0..1000] of Byte; 
    StdIn: TStream; 
    Count: Integer; 
begin 
    StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
    Count := StdIn.Read(Buffer, 1000); 
    StdIn.Free; 
    ShowMessageFmt('%d', [Count]); 
end; 

यदि आप करते हैं

dir *.pas | myapp.exe 

आप एक नंबर> 0 के साथ एक messagebox देखेंगे, और यदि आप कार्य करें:

myapp.exe 

आप करेंगे 0 के साथ एक संदेश बॉक्स देखें। दोनों मामलों में, फॉर्म दिखाया जाएगा।

+0

ठीक है, यह अच्छी तरह से काम करता है! क्या मैं 'गणना Christian

+0

हां, बस गणना <आकार (बफर) तक पढ़ना जारी रखें। ध्यान दें कि बफर आवश्यक रूप से शून्य-समाप्त नहीं है, इसलिए उदा। बफर जोड़ने के लिए एक TMemoryStream और अंत में अंत में # 0 जोड़ें, ताकि आप इसे एक स्ट्रिंग के रूप में पढ़ सकें। –

+0

हो गया। एक जादू की तरह काम करता है! – Christian

3

एक धारा दृष्टिकोण के बजाय Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
संबंधित मुद्दे