2011-08-14 33 views
7

tôi đã kịch bản hàng loạt sau:đọc chương trình STDIN trong Delphi

Và chương trình có nguồn này (nhiều hơn hoặc ít hơn):

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

Và đầu ra trong các bản ghi nhớ là:

Ổ đĩa trong ổ C không có nhãn.

tôi đã cố gắng:

  • đặt phần đọc vào một vòng lặp với eof như một điều kiện - bằng cách nào đó gây ra một vòng lặp vô hạn
  • viết một vòng lặp để tiếp tục đọc cho đến khi strlen(buff) là 0 - nó ra khỏi lần thứ hai vì lý do nào đó
  • nội dung đọc bao giờ 0,5 giây (Tôi đã nghĩ về viết không đồng bộ cho stdin), điều này cũng không thành công

Bằng cách này, chạy chương trình trực tiếp, không có dữ liệu stdin, gây ra một ngoại lệ EInputOutput (I/O Error) mã 6.

Trả lời

10

GUI apps don' t có stdin, stdout hoặc stderr được gán tự động. Bạn có thể làm một cái gì đó như:

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; 

Nếu bạn làm

dir *.pas | myapp.exe 

Bạn sẽ thấy một bảng thông báo với một số> 0, và nếu bạn làm:

myapp.exe 

Bạn sẽ thấy một hộp thông báo với 0. Trong cả hai trường hợp, biểu mẫu sẽ được hiển thị.

+0

OK, hoạt động tốt! Tôi có tiếp tục đọc cho đến khi 'Đếm Christian

+0

Có, hãy tiếp tục đọc cho đến khi đếm

+0

Xong. Làm việc như một say mê! – Christian

3

hãy thử sử dụng một cách tiếp cận dòng thay vì Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
Các vấn đề liên quan