如何逐行和逐行读取文件(包含mxn矩阵)?

时间:2015-02-03 01:32:41

标签: file matrix fortran

我有一个名为" test.dat"的文件。包含10x6矩阵如下:

  

test.dat文件的内容:


  

2 5 9 0 0 0
  1 3 7 6 0 0
  0 0 0 0 0 0
  0 0 0 0 0 0
  1 0 0 0 0 0
  0 0 0 0 0 0
  4 6 0 0 0 0
  3 0 0 0 0 0
  2 1 0 0 0 0
  0 0 0 0 0 0

我想将此矩阵转换为10x10矩阵,其内容如下:

  

所需的test1.dat文件的内容:


  

0 1 0 0 1 0 0 0 1 0
  1 0 1 0 0 1 1 0 0 0
  0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0
  1 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0
  0 0 0 1 0 1 0 0 0 0
  0 0 1 0 0 0 0 0 0 0
  1 1 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0

test1.dat是一个10x10矩阵,其中包含由此方法构造的行:例如,文件test1.dat的第1行0 1 0 0 1 0 0 0 1 0实际上是文件test.dat的第1行,2 5 9 0 0 0,如果不同,它的长度从6变为10,其i元素(在test.dat的第一行中显示)被1取代。即test.dat的第一行实际上表示该行应扩展为10个元素,其第2,第5和第9个元素应替换为" 1"其余的零 要将test.dat(矩阵A(10x6))转换为test1.dat(矩阵B(10x10)),我必须首先逐元素地读取每行test.dat,例如" j"第一行,如果它的元素等于例如" z",我写b(j,z)=1(B' s(j,z)元素)。到目前为止,我只能尝试阅读" A",元素依次如下:

   program test1  
      Integer (kind=8) :: c  
      integer (kind = 8) :: g, h  
      INTEGER, DIMENSION(10,6) :: z  
      open (unit=20, file="test.dat", access="sequential", form="formatted")  
      do g=1,6  
              Read(20,*) z  
              write (*, *) z  
      end do  
   end program test1  

这段代码将逐个元素地读取每一行,并将其写入。我对吗?但是我得到以下运行时错误:

  

文件test1.f90的第7行(单位= 20,文件=' test.dat')
  Fortran运行时错误:文件结束

现在我的问题是:

  
      
  1. 这段代码是否正确?
  2.   
  3. 我收到上述错误的代码有什么问题?
  4.   
  5. 如何实现其他程序以获取" test1.dat文件"?
  6.   

如果有人帮助我,我感激不尽。

  

P.S。机器信息:
  " Linux 3.16.6-200.fc20.x86_64(fedora 20)"
  " gcc版本4.8.3 20140911(红帽4.8.3-7)(GCC)"
  "使用.f90"

1 个答案:

答案 0 :(得分:0)

不,代码不正确。考虑循环

  do g=1,6  
          Read(20,*) z  
          write (*, *) z  
  end do  

尝试将z的所有60个元素读取6次。文件中没有足够的数字,运行时系统在完成之前会遇到文件的末尾 - 结果是您观察到的结果。

逐行读取文件的一种简单方法是修改循环,如下所示:

  do g=1,10  
          Read(20,*) z(g,:)  
          write (*, *) z(g,:)    
  end do  

此版本一次只读取一行z

在你提出下一个问题之前,花点时间研究这种简单的例行程序。在这里有几个近乎重复的问题,你可以从中找出问题,并自己修复它们。