我正在做一个化学研究项目,目前在一个名为Connectivity-M.txt
的文件中有一个378 x 378的零和一个矩阵。我正在尝试编写一个简单的程序来读取矩阵的每一列,并查找值为1的条目。由于矩阵的格式为A(i,j)
,因此我希望对其找到的每个值的i
,j
位置编程为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的条目。它写入此条目的i
,j
位置但是否则会出现读取错误:
在conn-read.f90文件的第25行(unit = 1,file ='Connectivity-M.txt')
Fortran运行时错误:文件结束
移动打开的文件语句后,我仍然遇到同样的错误。错误引用的行包含read语句。
答案 0 :(得分:3)
根据输入文件内容的布局以及打开方式,您可以在一行中阅读,如下所示:
read(1,*) A
让Fortran负责细节。如果您已经按行主顺序存储了数组,我希望这种快速简便的方法能够以“错误”的顺序读取它,因此您可能希望在读取后调换数组。或者您可能希望逐行阅读它,如下所示:
do ix = 1,nrows
read(1,*) A(ix,:)
end do
只有在文件的每一行中有正确的整数数量和正确的行数时,这些方法才有效。
在我写作的时候,有几点没有提出建议:
NEWUNIT=UNIT
语句中使用选项OPEN
,如果不使用至少2位数的数字。.eq.
并立即使用==
;它看起来像Fortran 95后来获得了认可。并回答您的问题:是的,错误语句指的是发生错误时正在执行的源代码行。意外结束文件的最可能原因是文件不在程序查找的位置(Fortran认为不存在的文件几乎与空文件相同)或文件包含的数据较少比你试图读它。后一种错误的原因可能是文件包含的数据少于您的想法,或者您的读取语句尝试读取的次数超出您的预期。如果没有看到你的输入文件,我不知道是哪种情况。无论你做什么都不发布你的整个输入文件,但如果你仍然有问题发布它的片段。
要在尝试打开文件之前检查文件是否存在,请使用inquire
语句。
我很怀疑你还没弄清楚发生了什么,因为你写了程序设法读取第一列而你的代码很明显地将值读入了数组逐行。
答案 1 :(得分:2)
此后可能需要更多调整,但第一步是将循环语句向上移动,如下所示:
open(unit = 1 , file = "Connectivity-M.txt")
do i = 1 , 378
do j = 1 , 378
原因是该文件只应打开一次,然后迭代它。
发布您的结果,我们会看到下一步。