2017-03-15 34 views
1

我有這個錯誤彈出,我不知道這是怎麼回事。我試圖在以下數據如下:創建格式化數組Fortran ...文件結尾錯誤

1 0000 1234 
2 0032 8383 
3 1201 3983 
4 1234 9292 
5 4567 9202 
6 7890 8382 
7 2324 9383 

跳過前4行,並且在單獨的陣列的第二列讀取整數(因此有一個陣列產生4567,7890,2324,以及其他生產9202,8382和9383)。下面是代碼我有:

Program test 
Implicit None 
integer :: i 
integer, parameter :: & 
m=7, & !total number of line 
n=4, & !line to skip 
p=3  !lines to read 
integer,dimension(m)::arr, arr2 !file to read 

open(12,file='something.txt',status='old') 
10 format (T5, I4) 
do i=1,n 
read(12,10)arr(i) 
end do 
do i=1,p 
read(12,10)arr(i) 
write(*,*)arr(i) 
end do 

20 format (T11, I4) 
do i=1,n 
read(12,20)arr2(i) 
end do 
do i=1,p 
read(12,20)arr2(i) 
write(*,*)arr2(i) 
end do 
End Program test 

第一陣列將正確讀入,但是當它達到第二個,文件的錯誤的端部出現在22行出現。我是Fortran新手,所以我不太清楚爲什麼會出現這種情況。

+1

您可能會錯過數組讀數之間的「rewind」。也就是說,如果我寫這個,我會在文件的一次傳遞中完成,而不是使用'T'編輯。 – francescalus

+0

聲明一個虛擬整數(例如'd')並讀取指向爲'read(12,*)d,arr(i),arr2(i)' – agentp

回答

0

當您在格式化文件中執行read時,程序將讀取整行並向前移動。

基本上在完全讀完arr之後,指針指向文件的末尾,那就是讀到arr2開始的地方。

你可以做兩件事情之一:

  1. rewind文件兩者讀取。
  2. 同時讀取兩個數組。

第二種解決方案比較好,因爲您沒有兩次讀取文件。這裏有一個例子:

program test 

    implicit none 
    integer :: i 
    integer, parameter :: & 
     m=7, & 
     n=4, & 
     p=m-n 

    integer :: arr(p), arr2(p) 

    open(unit=12, file='something.txt', action='READ', status='OLD') 

    do i = 1, n 
     read(12, "()") 
    end do 

    do i = 1, p 
     read(12, '(4X, I4, 2X, I4)') arr(i), arr2(i) 
    end do 

    close(12) 

    print*, arr 
    print*, arr2 

end program test 

我個人會做其他兩兩件事:

  1. 聲明一個虛擬整型變量,然後讀取使用

    read(12, *) dummy, arr(i), arr2(i) 
    

    ,而不是與格式周圍碴一個read聲明。

  2. 對於所有文件I/O我總是檢查iostat參數的結果,以確保一切按預期工作。

+0

的每一行列表感謝您解釋這個!這使得現在更有意義!另外的問題:如果我要兩次閱讀這個文件,在你提到的兩個解決方案之間我們做得更好了嗎? – cdmck004

+0

Again:文件I/O比內存I/O慢得多,所以我建議不要這樣做。也就是說,如果你要在代碼中的行'20格式(T11,I4)'行之前添加一個'rewind(12)',它應該可以工作。 – chw21