2012-03-04 53 views
0

我有数据填充这样一个数据文件得到错误在读取数据

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

看起来好像您正在阅读所有恰巧是数字或空格的字符。那是对的吗 ?或者你是否尝试读取整数并将字符变量用作某种缓冲区。这不是从文件中读取Fortran整数的方法。我对数组文本的声明感到困惑。拥有二维字符阵列的Fortran当然是正确的,但通常它是C程序员携带不适当语言习语的标志。 – 2012-03-04 18:58:16

回答

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> 
+0

谢谢..我可以访问这些值作为整数..例如,如果我想在文本中乘以2(3,33)那么应该是什么命令 – user991852 2012-03-05 18:21:43

+0

这是正确的文本(3,33)* 2 – user991852 2012-03-05 18:22:16

+0

抱歉。 (3,33)替换文字(3,3) – user991852 2012-03-05 18:25:46

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大小的数组,而不是10×10阅读。

+0

实际上我有.dat文件,它包含39个39个矩阵元素..因此我无法将其复制到.csv文件中。请编写代码如何读取和访问这些数据在fortran程序中 – user991852 2012-03-05 18:35:28

+1

@ user991852如果数据存储就像你在问题中说的那样,代码应该可以工作,你只需要将循环长度和数组大小改为39. Fortran中的列表控制输入(read语句中的* )适用于空格和逗号分隔的值。 – bananafish 2012-03-05 20:29:56

+0

谢谢..很多..我明白了 – user991852 2012-03-06 03:59:17