如何读取矩阵并将某些值写入Fortran中的新文件

时间:2012-10-23 15:37:26

标签: fortran fortran90

我正在做一个化学研究项目,目前在一个名为Connectivity-M.txt的文件中有一个378 x 378的零和一个矩阵。我正在尝试编写一个简单的程序来读取矩阵的每一列,并查找值为1的条目。由于矩阵的格式为A(i,j),因此我希望对其找到的每个值的ij位置编程为Wires.txt。到目前为止,这是我的代码:

program connectivity_matrixread

IMPLICIT none
integer :: i , j
INTEGER, DIMENSION(378,378) :: A

open(unit = 1 , file = "Connectivity-M.txt")
open(unit = 2 , file = "Wires.txt")

! Read values
do i = 1 , 378
    do j = 1 , 378


        Read(1,*) A(i,j)

        if (A(i,j) .eq. 1) then
            write(2,*) i , j
        endif

    enddo
enddo

end program connectivity_matrixread

程序设法读取第一列,其中只有一个值为1的条目。它写入此条目的ij位置但是否则会出现读取错误:

  

在conn-read.f90文件的第25行(unit = 1,file ='Connectivity-M.txt')
  Fortran运行时错误:文件结束

移动打开的文件语句后,我仍然遇到同样的错误。错误引用的行包含read语句。

2 个答案:

答案 0 :(得分:3)

根据输入文件内容的布局以及打开方式,您可以在一行中阅读,如下所示:

read(1,*) A

让Fortran负责细节。如果您已经按行主顺序存储了数组,我希望这种快速简便的方法能够以“错误”的顺序读取它,因此您可能希望在读取后调换数组。或者您可能希望逐行阅读它,如下所示:

do ix = 1,nrows
    read(1,*) A(ix,:)
end do

只有在文件的每一行中有正确的整数数量和正确的行数时,这些方法才有效。

在我写作的时候,有几点没有提出建议:

  • 不要养成在程序中使用一位数单位标识符的习惯。如今,在程序启动时,已经使用了除0,5和6之外的标识符,这是不寻常的,但并非完全不可能。如果您有(非常)最新的编译器,请在NEWUNIT=UNIT语句中使用选项OPEN,如果不使用至少2位数的数字。
  • 这是21世纪,你可以放弃古老的.eq.并立即使用==;它看起来像Fortran 95后来获得了认可。

并回答您的问题:是的,错误语句指的是发生错误时正在执行的源代码行。意外结束文件的最可能原因是文件不在程序查找的位置(Fortran认为不存在的文件几乎与空文件相同)或文件包含的数据较少比你试图读它。后一种错误的原因可能是文件包含的数据少于您的想法,或者您的读取语句尝试读取的次数超出您的预期。如果没有看到你的输入文件,我不知道是哪种情况。无论你做什么都不发布你的整个输入文件,但如果你仍然有问题发布它的片段。

要在尝试打开文件之前检查文件是否存在,请使用inquire语句。

我很怀疑你还没弄清楚发生了什么,因为你写了程序设法读取第一列而你的代码很明显地将值读入了数组逐行。

答案 1 :(得分:2)

此后可能需要更多调整,但第一步是将循环语句向上移动,如下所示:

open(unit = 1 , file = "Connectivity-M.txt")

do i = 1 , 378

    do j = 1 , 378

原因是该文件只应打开一次,然后迭代它。

发布您的结果,我们会看到下一步。