2011-12-14 36 views
19

Làm cách nào để đọc và ghi vào luồng đầu vào, đầu ra và lỗi chuẩn stdin, stdoutstderr ở Fortran? Tôi đã nghe bằng văn bản tới stderr, ví dụ: sử dụngwrite(5, fmt=...), với 5 đơn vị cho stderr và tôi biết cách viết tới stdout là sử dụng write(*, fmt=...).Đơn vị đầu vào và đầu ra tiêu chuẩn trong Fortran 90?

Làm cách nào để đọc và ghi vào đơn vị đầu vào và đầu ra tiêu chuẩn bằng trình biên dịch ifort?

Compiler phiên bản:

Intel (R) Fortran Compiler cho các ứng dụng chạy trên Intel (R) 64, Phiên bản 10.0 Build 20.070.426 Gói ID: Copyright l_fc_p_10.0.023 (C) 1985-2007 Tập đoàn Intel. Tất cả các quyền được bảo lưu

+0

Phiên bản ifort nào? Họ có hỗ trợ F2003 ít nhất cho các phiên bản 11.1 trở đi. – tpg2114

Trả lời

33

Nếu bạn có một trình biên dịch Fortran 2003, các mô-đun nội iso_fortran_env định nghĩa các biến input_unit, output_uniterror_unit mà trỏ đến tiêu chuẩn trong, tiêu chuẩn ra ngoài và tiêu chuẩn lỗi tương ứng.

tôi có xu hướng sử dụng một cái gì đó giống như

#ifdef f2003 
use, intrinsic :: iso_fortran_env, only : stdin=>input_unit, & 
              stdout=>output_unit, & 
              stderr=>error_unit 
#else 
#define stdin 5 
#define stdout 6 
#define stderr 0 
#endif 

trong thói quen đầu vào/đầu ra của tôi. Mặc dù điều này tất nhiên có nghĩa là preprocessing tệp nguồn của bạn (để làm điều này với ifort, sử dụng cờ -fpp khi biên dịch mã nguồn hoặc thay đổi đuôi tệp nguồn từ .f thành .F hoặc từ .f90 thành .F90).

Một thay thế cho điều này sẽ được viết riêng, không thực chất, iso_fortran_env mô-đun của bạn (nếu bạn không có một trình biên dịch Fortran 2003) , như đã thảo luận here (liên kết này đã chết kể từ khi câu trả lời này đã được đăng) . Trong ví dụ này, họ sử dụng một mô-đun:

module iso_fortran_env 

    ! Nonintrinsic version for Lahey/Fujitsu Fortran for Linux. 
    ! See Subclause 13.8.2 of the Fortran 2003 standard. 

    implicit NONE 
    public 

    integer, parameter :: Character_Storage_Size = 8 
    integer, parameter :: Error_Unit = 0 
    integer, parameter :: File_Storage_Size = 8 
    integer, parameter :: Input_Unit = 5 
    integer, parameter :: IOSTAT_END = -1 
    integer, parameter :: IOSTAT_EOR = -2 
    integer, parameter :: Numeric_Storage_Size = 32 
    integer, parameter :: Output_Unit = 6 

end module iso_fortran_env 

Như đã đề cập trong câu trả lời khác, 0, 5 và 6 là thườngstderr, stdinstdout (đây là đúng đối với ifort trên Linux) nhưng đây là không được xác định theo tiêu chuẩn Fortran.Sử dụng mô-đun iso_fortran_env là cách chính xác để ghi một cách hợp lý vào các đơn vị này.

+0

Thật không may là tôi không có một trình biên dịch tương thích với 2003; Tôi đang ở fortran 90. – Pureferret

+0

@Pureferret Vì vậy, bạn chỉ có thể sử dụng một trong những phương pháp thay thế mà tôi đề nghị. Các phiên bản 'ifort' gần đây cũng hỗ trợ các phần của tiêu chuẩn 2003 bao gồm' iso_fortran_env'. – Chris

+0

Tôi đã thử điều này và nó không hoạt động, trình biên dịch cho biết mọi thứ trong khối đầu tiên của bạn là 'cú pháp tiền xử lý xấu' (tôi nghĩ) Tôi chưa thử khối thứ hai của bạn, nhưng nếu giải pháp @ tpg2114 không hoạt động , Tôi không chắc tại sao/giải pháp của bạn hoạt động như thế nào. – Pureferret

5

Thực tế là 0 cho stderr. 5 là stdin, 6 là stdout.

Ví dụ:

PROGRAM TEST 
    WRITE(0,*) "Error" 
    WRITE(6,*) "Good" 
END PROGRAM TEST 

Cung cấp:

./a.out 
Error 
Good 

khi

./a.out 2> /dev/null 
Good 

tôi sẽ lưu trữ một tham số đó là thiết bị lỗi chuẩn = 0 để làm cho nó di động, vì vậy nếu bạn nhấn một nền tảng khác nhau, bạn chỉ có thể thay đổi tham số.

Ví dụ này được biên dịch và chạy với ifort 12.1.1.256, 11.1.069, 11.1.072 và 11.1.073.

+0

Tôi đã thử điều này và nó không hoạt động. – Pureferret

+0

Tôi vừa thử với 4 phiên bản khác nhau của ifort và nó hoạt động, và nó cũng hoạt động với gfortran 4.6.0, 4.6.1 và 4.6.2. Bạn có thể đăng những lỗi mà nó mang lại cho bạn không? – tpg2114

+0

Nó không cung cấp cho tôi bất kỳ lỗi nào bằng cách sử dụng 'write (0, *)' nhưng khi tôi lại trực tiếp stderr vào tập tin, không có gì xảy ra. Phiên bản là: Intel (R) Fortran Compiler cho các ứng dụng chạy trên Intel (R) 64, Phiên bản 10.0 Build 20070426 ID gói: l_fc_p_10.0.023 Bản quyền (C) 1985-2007 Tập đoàn Intel. Đã đăng ký Bản quyền. – Pureferret

12

Tiêu chuẩn Fortran không chỉ định số đơn vị nào tương ứng với stdin/out/err. Quy ước thông thường, tiếp theo là v.d. gfortran, là stderr = 0, stdin = 5, stdout = 6.

Nếu trình biên dịch của bạn hỗ trợ mô đun nội tại F2003 ISO_FORTRAN_ENV, mô-đun đó chứa hằng số INPUT_UNIT, OUTPUT_UNIT và ERROR_UNIT cho phép lập trình truy xuất có thể lấy số đơn vị cho các đơn vị được kết nối trước.

0

Cách thông thường để viết thư cho stdout trong Fortran là đặt một dấu sao thay vì số lượng đơn vị, tức là,

WRITE(*,fmt) something 

hoặc chỉ đơn giản là sử dụng

PRINT fmt,something 

Tương tự, cách thức chuẩn để đọc từ stdin

READ(*,fmt) something 

Không có tiêu chuẩn d cách ghi vào stderr trừ khi bạn sử dụng ERROR_UNIT từ mô-đun ISO_FORTRAN_ENV, yêu cầu Fortran 2003 trở lên.

Số đơn vị 0, 5 và 6 chắc chắn sẽ hoạt động trong trình biên dịch ifort (và cũng trong một số trình biên dịch Fortran khác), nhưng hãy nhớ rằng chúng phụ thuộc vào trình biên dịch.

Các vấn đề liên quan