2013-03-21 198 views
1

我是Fortran的新手,我需要編寫一個代碼,允許我讀取包含數據數組的文本文件(.dat)(1876列x 3126行)不規則空格/不規則地分隔,並將其寫入一個格式一致的新文件。總之,我只想讓數據的列彼此對齊。Fortran:讀取字符串中帶有不規則分隔項的文本文件

例:

<4 spaces> 0.2341 15.0769 
<2 spaces> -10.0672 1.6278  
<3 spaces> 66.9851 -14.7123 
<3 spaces> -0.4468 -2.5673 

上面的例子是基本上數據的列應看起來像的空間相應的數字什麼每個值之前所指示的。值的格式是'f10.4'

這是我試着寫的代碼。我能夠編譯代碼並運行exe文件,但是它無法從文本文件中讀取併產生運行時錯誤:文件結束。

program refgrid 
implicit none 

    integer :: nrow, ncol 
    integer :: i, j 
    real, dimension(:,:), allocatable :: mat 

    print *, ' Input number of rows: ' 
    read *, nrow 
    print *, 'Input number of columns: ' 
    read *, ncol 

    allocate(mat(1:ncol,1:nrow)) 

    open(UNIT=1, FILE='bathymetry2.dat', FORM='FORMATTED', STATUS='OLD', ACTION='READ') 

    do i=1, nrow 
     read(UNIT=1, FMT=*) mat 
    end do 

    close(UNIT=1) 

    open(UNIT=1, FILE='refgrid.dat', FORM='FORMATTED', STATUS='NEW', ACTION='WRITE') 

    do i=1, nrow 
     write(UNIT=1, FMT=101) mat 
     101 format(1826f10.4) 
    enddo 

    close(UNIT=1) 

end program refgrid 

我的問題:

  1. 如何從使用do循環線連續讀取的值? 我在'do' 循環中使用f格式的重複功能有點困惑。

  2. 我可以作爲一個整體數組讀取/寫入數組「mat」嗎?或者如何將 data_list分配爲讀/寫?我可以分配整個矩陣而不是單個元素嗎?

我將不勝感激在這個問題上的任何幫助。謝謝!

回答

1

問題是,在循環中的每一次迭代中,都會嘗試讀入與整個數組mat中一樣多的元素。您應該在每次迭代中只填寫一列。或者,您可以使用一個讀取語句讀取整個數組,而不使用任何循環。

至於寫作方面,您需要重複該格式的次數,因爲您有列。 我建議動態創建一個格式字符串,以便它自動適應用戶輸入的列數。看下面的例子。您也可以省略寫循環,因爲Fortran會自動添加記錄符號的末尾(換行符),當所有格式指定已被使用時,它將開始再次應用它們。

program refgrid 
    implicit none 

    integer :: nrow, ncol 
    real, allocatable :: mat(:,:) 
    character(20) :: form 

    print *, ' Input number of rows: ' 
    read *, nrow 
    print *, 'Input number of columns: ' 
    read *, ncol 

    allocate(mat(1:ncol, 1:nrow)) 
    open(unit=1, file='bathymetry2.dat', status='OLD', action='READ') 
    read(1, *) mat 
    close(1) 

    write(form, "(A,I0,A)") "(", ncol, "F10.4)" 
    open(1, file='refgrid.dat', form='FORMATTED', status='NEW', action='WRITE') 
    write(1, form) mat 
    close(1) 

end program refgrid 

更新:由於動態創建的格式說明的:你寫串入form三樣東西:一個字符串(A),只有儘可能多的字符一個整數,因爲它需要(I0)和其他字符串(A)。第一個字符串是(,整數是ncol,第二個字符串是F10.4)。因此,如果ncol的值爲128,那麼您將在form的字符串(128F10.4)。這是一個包含有效格式說明符的字符串,因此您可以在寫入語句中使用它,而不是使用硬編碼格式說明符。

+0

謝謝先生。得到它的工作。這真的非常簡單! 儘管對於寫作部分,我確實得到了要點,但我很迷茫>(A,I0,A) – user2195279 2013-03-22 03:45:53

+0

不客氣,我更新了一些額外的解釋我的帖子。 – 2013-03-22 06:32:57

相關問題