在读取数据时出错

时间:2012-03-04 18:32:25

标签: fortran fortran90

我有一个数据文件以这种方式填写数据

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
    .
    .

    .

    .
    .
91 92 93 94 95 96 97 98 99 100

我想将这些数据存储在(10,10)的矩阵中 这是我的程序

program test
integer j,n,m
character,dimension(10,10) ::text
character*50 line
open(unit=3,file="tmp.txt",status='old')
n=1
read(3,"(a50)"),line

read(line,*,end=1),(text(1,i),i=1,10)
1 read(3,"(a50)",end=3),line
n=n+1
read(line,*,end=1)(text(n,i),i=i,10)

3 close(3)

end program test

但我没有得到正确的价值。

2 个答案:

答案 0 :(得分:5)

假设您对将数字存储为整数感到满意,最简单的方法是这样做:

    PROGRAM read_data

    integer :: i
    integer :: numbers(39,39)
    character(10) :: infile = "data.dat"
    character(10) :: outfile = "output.dat"

    open(1,file=infile)
    open(2,file=outfile)

    do i=1,39
        read(1,*) numbers(i,1:39)
    end do

    !write output to check
    do i=1,39
        write(2,'(39I5)') numbers(i,1:39)
    end do

    close(1)
    close(2)

    END PROGRAM

我不建议使用字符串来存储任何类型的变量,因为Fortran不太善于字符串处理。如果您在某些时候需要将数据用作字符串,请将其写入字符串变量,就像写入文件一样:

write(my_string,'(I5)') numbers(1,1)

编辑:更改代码以读取39x39大小的数组而不是10x10。

答案 1 :(得分:4)

我不认为首先读取字符串然后尝试解析这是要走的路;让Fortran为您划分空格分隔的字符串。另请注意,您希望字符数组是长度为字符串的数组,而不仅仅是字符:

program test
    character(len=3),dimension(10,10) ::text
    character(len=7), parameter :: filename="tmp.txt"
    integer :: i,j
    integer :: nlines

    open(unit=3,file=filename)
    do i=1,10
        write(3,fmt="(10(i3,1x))"), (10*(i-1)+j, j=1,10)
    enddo
    close(unit=3)

    open(unit=4,file=filename,status='old')

    do i=1,10
        read(4,*,end=1), (text(i,j),j=1,10)
    enddo
 1  nlines = i
    close(unit=4)

    print *,' Read in character array: '
    do i=1,nlines-1
        print "(10('<',a,'>',1x))", (trim(text(i,j)), j=1,10)
    enddo

end program test

运行此功能

$ ./test 
  Read in character array: 
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>
<11> <12> <13> <14> <15> <16> <17> <18> <19> <20>
<21> <22> <23> <24> <25> <26> <27> <28> <29> <30>
<31> <32> <33> <34> <35> <36> <37> <38> <39> <40>
<41> <42> <43> <44> <45> <46> <47> <48> <49> <50>
<51> <52> <53> <54> <55> <56> <57> <58> <59> <60>
<61> <62> <63> <64> <65> <66> <67> <68> <69> <70>
<71> <72> <73> <74> <75> <76> <77> <78> <79> <80>
<81> <82> <83> <84> <85> <86> <87> <88> <89> <90>
<91> <92> <93> <94> <95> <96> <97> <98> <99> <100>