2009-07-14 35 views
9

Xin lỗi nếu đây là một câu hỏi trùng lặp, nhưng tôi không thấy bất cứ điều gì chính xác như thế này.FORTRAN READ()

READ() làm gì trong FORTRAN?

Ví dụ:

READ(1,82) 
+3

Tôi không chắc chắn rằng "fortran" và "người mới bắt đầu" nên được kết hợp. – stevedbrown

Trả lời

14

1 là xử lý tập tin, mà bạn phải mở ra với các cuộc gọi mở thích hợp. 82 là nhãn tham chiếu định dạng, nghĩa là cách bạn sẽ báo cáo dữ liệu theo định dạng hình ảnh.

 program foo 
     implicit none 
     integer :: i 
     double precision :: a 

     write (*,*) 'give me an integer and a float' 
     read (*,82) i,a 
     write (*,82) i,a 
82  format (I4, F8.3) 
     end program 

Trong ví dụ này, chương trình chấp nhận từ đầu vào chuẩn (không có số đơn vị nào được chỉ định và vì vậy tôi đặt *) một số nguyên và giá trị dấu phẩy động. định dạng nói rằng số nguyên chiếm bốn cột đầu tiên, sau đó tôi có một float nằm trong 8 cột, với 3 chữ số sau dấu thập phân

Nếu tôi chạy chương trình ngay bây giờ và tôi không tuân theo chính xác định dạng này , chương trình sẽ khiếu nại và sụp đổ, bởi vì 4 cột đầu tiên được dự kiến ​​sẽ đại diện cho một số nguyên (do định dạng I4) và "5 3." không phải là một số nguyên hợp lệ

$ ./a.out 
give me an integer and a float 
5 3.5 
At line 7 of file test.f (Unit 5) 
Traceback: not available, compile with -ftrace=frame or -ftrace=full 
Fortran runtime error: Bad value during integer read 

Tuy nhiên, một đặc điểm kỹ thuật chính xác (xin lưu ý ba không gian trước số 5) sẽ thực hiện các hoạt động chính xác (với dung sai nhỏ, nó không phải rằng nghiêm ngặt)

$ ./a.out 
give me an integer and a float 
    5 3.5 
    5 3.500 
$ 
+0

Cảm ơn bạn đời! Tôi đang nhìn xung quanh để giải thích chính xác điều này. – SRG

6

Nó đọc từ "đơn vị" (tệp mở) số 1, theo tuyên bố FORMAT tại nhãn 82. Tuy nhiên, vì tuyên bố không liệt kê bất kỳ biến nào, không có chỗ để đặt dữ liệu mà nó đọc Cứu giúp; READ(1,82) FOOBAR sẽ hữu ích hơn khi đặt dữ liệu mà nó đang đọc trong FOOBAR biến.

+1

IIRC, tệp số 5 là tương đương với stdin và số 6 tương đương với giá trị stdout. Tệp 1 có thể là một tệp trong hệ thống tệp. Tôi có vẻ nhớ rằng những con số này được dự định để lập bản đồ lên ổ băng, nhưng đó là một thời gian dài trước đây. –

+0

@ David, heh yes, mang tôi trở lại tuổi trẻ của tôi! -) –

+0

@David, @Alex, đây là ngôn ngữ lập trình đầu tiên tôi học được! 5 và 6 thực sự là đầu vào và đầu ra tiêu chuẩn, nhưng bạn phải thiết lập các số khác từ dòng lệnh. Và bạn có thể đặt chúng vào bất cứ thứ gì: đĩa, ổ băng, bộ đệm ảo, v.v. – azheglov

0

Nó đọc từ tổ máy số 1 sử dụng định dạng theo quy định của báo cáo kết quả đánh số 82.

+0

và câu trả lời của bạn sẽ thêm vào chủ đề này như thế nào? – SilentGhost

3

Bạn có thể làm một vài điều hơn với fortran "đọc" tuyên bố.

xem xét: đọc (đơn vị #, định dạng, tùy chọn) ... generic

read (7,*,end=10) 

đâu, "7" là số đơn vị đọc từ, "*" là định dạng (mặc định trong trường hợp này), và "10" là số dòng mà điều khiển chương trình nhảy đến khi thiết bị đọc/tệp đạt đến eOF. Các "tùy chọn" khe có thể được lấp đầy với những thứ như "err = 'số dòng để đi đến" ", hoặc iostat, trước =" không ". Bạn có thể xem some more of these

Phần định dạng là nơi bạn có thể chỉ định chính xác hơn định dạng dữ liệu bạn mong đợi. Ví dụ, nếu bạn có một specifier định dạng như:

read (25,"(2X, 2I5, F7.3, A)") 

Ở đây, "2X", đề cập đến 2 không gian, các "2I5", đề cập đến 2 số nguyên có 5 chữ số, "F7.3", đề cập đến một giá trị thập phân có tổng chiều dài là 7, với ba chữ số sau dấu thập phân. Chữ "A" dùng để chỉ một ký tự. Bạn có thể xem thêm một số chi tiết của these

CHÀO MỪNG!

0

Khi Fortran đọc từ một tệp, nó yêu cầu các câu lệnh READ nhận dạng duy nhất tệp. Việc xác định được thực hiện bằng cách sử dụng định danh đơn vị Fortran.

Một định danh đơn vị có thể là một trong những cách sau:

1) Một biến số nguyên hoặc biểu thức mà giá trị lớn hơn hoặc bằng 0.

2) Một dấu (*) chỉ được phép trên ĐỌC và VIẾT báo cáo. Trên các câu lệnh READ, dấu hoa thị đề cập đến đơn vị 100 (đầu vào tiêu chuẩn).

số đơn vị được cung cấp tốt nhất sử dụng newunit

open(newunit=i,file='test') 

Sử dụng các báo cáo Yêu cầu để kiểm tra tính hợp lệ (tồn tại) của bất kỳ số đơn vị trước khi sử dụng nó, như trong ví dụ sau:

logical :: idok, fop 
inquire (unit=i, exist=idok, opened=fop) 
if (idok .and. .not. fop) then 
    open (unit = i, ...) 
endif 

Sau đó, chúng ta có câu lệnh FORMAT, một câu lệnh có nhãn có thể xuất hiện trong bất kỳ phần nào của chương trình mà ở đó định dạng được hiển thị.

Nó có dạng

READ(*,100) I, J, K 

Các FORMAT tuyên bố

100 FORMAT(I10,I10,I10) 

Một tuyên bố FORMAT hơi khác nhau là

100 FORMAT(3I10.8) 

mà một lần nữa mang lại ba số nguyên phải biện minh của chiều rộng 10 nhưng thời gian này yêu cầu phải in tối thiểu 8 chữ số.

+2

Một vài sai lầm: số nhận dạng đơn vị có thể âm (nhưng không phải -1) và sẽ là nếu nó liên quan đến kết nối được tạo bằng bộ định danh 'newunit'; '*' không có nghĩa là 100; 100--102 có thể được cho phép; các đơn vị 0, 5 và 6 không chắc chắn liên quan đến bất kỳ thứ gì; trong khi câu lệnh 'format' có thể xuất hiện ở bất kỳ đâu, nó phải nằm trong cùng phạm vi của các câu lệnh truyền dữ liệu tham chiếu đến nó. – francescalus

+0

Sẽ cập nhật bài đăng – Zeus

+0

Tôi có một số mã nơi người ta sử dụng '6' cho đầu ra màn hình. Các chi tiết chính xác là gì? – Zeus

1

"1" đơn vị mà bạn đã sử dụng để mở tệp trong fortran và "82" chỉ định định dạng cho lệnh đọc.

open(1,file=fname,status='unknown') 
read(1,82) var_name 
82 format(2I5) 

Đoạn mã trên sẽ mở ra một tập tin gọi là "fname" lệnh đọc đọc từ tập tin fname như nó đã được mở ra với một đơn vị "1" và lệnh đọc đọc trong định dạng theo quy định của định dạng 82. Chi tiết về định dạng trong fortran được đưa ra dưới đây:

nim (Integer Specification) 
nfm.d (Floating point Specification) 
nEm.d(Exponential Specification) 
nAm (string specification) 

where 
"m" is the number of character spaces reserved for printing. (should be more than what you are reading otherwise read statement would not give correct results) 
"n" is the number of integers, floating point, characters or exponential numbers that you want to read. 
"d" are the number of decimal places up to which you want to read. 
Các vấn đề liên quan