将.xyz文件读入数组

时间:2017-01-28 09:09:52

标签: arrays fortran fortran90

我目前创建的代码可以从插入的目录中打开文件,然后开始将该数据分类为两个不同的数组,一个整数和一个字符。输入文件如下所示:

1817
Plot50.0.xyz
  C        0.70900        0.00000        0.00000
  C        0.00000        1.22802        0.00000
  C        2.12700        0.00000        0.00000
  C        2.83600        1.22802        0.00000
  C        4.96300        0.00000        0.00000
  C        4.25400        1.22802        0.00000
  C        6.38100        0.00000        0.00000
  C        7.09000        1.22802        0.00000
  C        9.21700        0.00000        0.00000
  C        8.50800 

datafile

现在我不确定在打开文件(格式等)时是否还没有正确分配所有内容但是这里的代码是[工作]:

program test01

character(len=40)    :: filename           !Storing the file name
character(len=20)    :: nam                !Collecting the file name within the file
integer(8)           :: N                  !Number of coordinates within the file
real(8), allocatable :: coa(:,:)           !Array containing xyz coordinates
character(len=6), allocatable :: atom(:,:) !Array containing the atomic make up
integer(8)           :: i,j,k              !Do loop parameters

    filename = '' 
    write (6,*) 'Enter file name' 
    read (5,*) filename 
    open (10, file=filename, status='OLD') 
    write (6,*) 'Sucessfully opened file:', filename 
    read(10,*) N

    allocate (coa(N,4))
    allocate (atom(N,1))
    read (10,*) nam
        print*, nam

        i = 0
        do while (i < N)
            read(10,*) atom(i,1), coa(i,2:4)
            i = i+1  
        end do

    print*, atom(0,1), atom(1,1), atom(4,1), atom(1818,1) !checking
    print*, coa(0,2), coa(1500,3)                         !checking   
    close (10) 

end program test01

所以我的主要问题在于,有没有更好的方法来创建数组(需要两个,因为我认为字符和实际不能混合,而coa数组稍后用于计算)并特别从文件中提取某些数据(更多是为了跳过文件的第2行而不是将其插入到一个字符中以删除它,因为它在我尝试创建数组时导致了所有问题)。

1 个答案:

答案 0 :(得分:2)

你写有没有更好的方法来创建数组。让我们从正确的方式开始,这不是......

i = 0
do while (i < N)
    read(10,*) atom(i,1), coa(i,2:4)
    i = i+1  
end do

看起来就像是用Fortran编写的C循环(for (i=0; i<N; i++)),它错误地开始索引到行0的数组中。由于代码不会在0处启动数组索引,并且Fortran默认从1编制索引,因此read的第一次执行会将数据读取到超出范围的内存位置数组。

正确的Fortranic方式

do i = 1, N
    read(10,*) atom(i,1), coa(i,2:4)
end do

我在其他地方看到你从数组的行0打印了值。你很幸运,那些外界访问不会到达程序地址空间之外的地址并导致分段错误。

程序坏了,只是它有点破碎,并没有给你带来任何痛苦。