2012-10-23 51 views
0

我正在做一个化学研究项目,目前在名为Connectivity-M.txt的文件中有一个378 x 378的零和一个矩阵。我正在尝试编写一个简单的程序来读取矩阵的每一列,并查找值为1的条目。由于矩阵的格式为A(i,j),我想要编写i,j位置,以找到每个值为一个新文件Wires.txt的位置。这是我到目前为止的代码:如何读取矩阵并将某些值写入fortran90中的新文件

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位置,但否则我得到一个错误,读取:

At line 25 of file conn-read.f90 (unit = 1, file = 'Connectivity-M.txt')
Fortran runtime error: End of file

移动打开文件语句后,我仍然收到相同的错误。错误引用的行包含read语句。对不起,我对Fortran和堆栈溢出都很陌生,我非常感谢帮助。

+4

花几分钟时间熟悉SO,以及如何最好地在这里提出问题。特别是,了解如何将代码段格式化为代码;看到文本编辑框上方的小图标,尤其是看起来像“{}”的图标。我和很多Fortran程序员一样,太老,脾气暴躁,无法帮助那些不尽如人意的人。 –

回答

3

取决于你的输入文件的内容以及如何打开它的布局,你也许可以在一行中读它,像这样:

read(1,*) A 

,让Fortran语言采取的细节。如果你的数组按照行的顺序存储,我期望这个快速简单的方法会以'错误'的顺序读取它,所以你可能想在读取数组后转置数组。或者你可能需要阅读它逐行而不是像这样的:如果有整数的文件和行权数量的每一行权数量

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

这些方法才有效。

当我在写,请教几个没有提出的位:

  • 不要进入你的程序中使用个位数的单位标识符的习惯。当你的程序启动时,已经在使用0,5和6以外的其他标识符是很不寻常的,但并非完全不可能。如果您有一个(非常)最新的编译器,请在您的OPEN语句中使用选项NEWUNIT=UNIT,如果不使用至少有2位数的数字。
  • 现在是21世纪,你可以放弃陈旧的.eq.并使用==;看起来像Fortran 95和后来已经获得认可。

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

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

我很怀疑你还没弄清楚因为你写了什么而发生了什么该程序设法读取第一列,而你的代码很清楚地读取了数组中的值row-by -行。

2

它可能需要在这之后更多的调整,但第一步是移动的公开声明后,环上面,像这样:

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

do i = 1 , 378 

    do j = 1 , 378 

的原因是,该文件只能用一次打开,然后你遍历它。

发布您的结果,我们将看到接下来会发生什么。

+0

重要提示:请关注High Performance Mark的评论。学习Stack Overflow是如何实现通信平滑的,这是个好主意。其实,你可以编辑你的问题并在那里更新你的代码。选择代码部分并点击{}按钮。原来如此;大!看@Chris做了什么。 –

+0

我不确定我是否正确发布,但我更新了上面的代码。有没有涉及的逻辑有瑕疵? –

+0

现在,最有可能的就是关于输入文件。我相信阅读(1,*)A(i,j)期望每行一个数字。很可能,事实并非如此。每一行实际包含什么? –

相关问题