2011-10-20 11 views
9

Hiện nay, tôi đang sử dụng dòng lệnh shell các cuộc gọi từ chương trình fortran tôi sử dụng hệ thống phi tiêu chuẩn thông thường bên trong (tương tự như Fortran 2008 EXECUTE_COMMAND_LINE nội tại):Execute dòng lệnh và gửi lại lệnh đầu ra

CALL SYSTEM(commandStr) 

nơi commandStr là một chuỗi ký tự chứa lệnh trình bao mà tôi muốn thực hiện. Tại thời điểm này, tôi không nhận thức được một cách trực tiếp để trả về đầu ra của commandStr, nhưng chỉ có trạng thái trả về của nó. Vì vậy, những gì tôi đang làm bây giờ là viết đầu ra vào một tập tin, và sau đó đọc các tập tin từ bên trong chương trình Fortran. Ví dụ:

CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile') 

nếu tôi muốn xóa dấu phẩy khỏi myFile. Sau đó tôi sử dụng OPEN và READ để lấy nội dung của dummyFile.

Điều này hoạt động tốt, tuy nhiên tôi lo ngại về việc viết/đọc tệp từ đĩa, đặc biệt nếu tôi đang thực hiện việc này trong vòng lặp dài và nếu đầu ra commandStr lớn. Có cách nào để tái trực tiếp đầu ra commandStr vào một bộ nhớ đệm (không phải đĩa cứng) mà tôi có thể truy cập trực tiếp từ chương trình Fortran của tôi (có thể thông qua một số UNIT cụ thể)?

+0

Nếu đầu ra lớn, sẽ không có ý nghĩa hơn khi lưu trữ tệp đó? – Rook

+0

Tôi đoán nó sẽ không tạo sự khác biệt cho mã - phần duy nhất tôi lo lắng ở đây là thường xuyên I/O đến và từ đĩa ảnh hưởng đến hiệu quả chương trình. Có lý do nào tốt hơn để lưu trữ nó vào tập tin, một cái gì đó mà tôi đang thiếu? – milancurcic

+1

Vâng, theo quan điểm của tôi, đó chỉ là vấn đề thực tiễn. Nếu nó không phải là rất nhiều dữ liệu, lưu trữ nó vào một tập tin sẽ không thành vấn đề. Nó là rất nhiều dữ liệu, và tôi đang sử dụng lại nó trong chương trình đang chạy, nơi cuối cùng tôi muốn nó là bộ nhớ. Tôi cần bộ nhớ để lưu trữ các kết quả của "phân tích cú pháp" tập tin đó, và sau đó để làm một cái gì đó với những người. Điều này có lẽ đã được giải thích tốt hơn nhưng tôi nghĩ rằng bạn có được ý tưởng. – Rook

Trả lời

1

Nếu điều này trong môi trường POSIX, chức năng thư viện popen() cũng có thể có sẵn.

Xem tài liệu cho môi trường Fortran của bạn vì tôi không chắc chắn về ngữ nghĩa để kết nối i/o với Fortran. Nếu nó giống như thư viện thời gian chạy C, kết nối tệp cũng cần một chức năng đặc biệt để đóng nó, pclose().

+1

Bạn có thể sử dụng công cụ Posix thông qua ISO_C_Binding, có một dự án liên quan đến điều đó tại: http://sourceforge.net/projects/fortranposix/ – haraldkl