使用格式说明符查找数组中的特定元素

时间:2016-10-26 22:00:49

标签: arrays matrix fortran fortran90

我试图在我的矩阵数组中提取一个文本文件中的特定元素,它似乎并没有提取我想要的元素。 这是我正在使用的代码

real :: a

    open(unit=2,file='matrix.txt',status='old', form= 'formatted', action='read', &
        iostat=io_error)
      if ( io_error == 0) then

            read(2,100) a
            100 format(1x,2/,E8.1)
             write(*,*) 'a', a

       else
           write(*,*) 'unable to open file', &
                       io_error,' failed'
       end if

 close(unit=2)

以下是我拥有的值

-1.000000e-001  -55.000000e+000 2
-2.000000e-001  -7.000000e-001  8
-3.000000e-001   0.000000e+000  5
-4.000000e-001   5.000000e-001  17

我想输出第3行第2列中的元素。 这甚至可能吗?

但是当我运行代码时,我得到-2。

在从这样的文件中读取元素时,是否还有其他方法可以隔离元素?我宁愿不把它读成虚拟变量。

2 个答案:

答案 0 :(得分:1)

当然有可能,你需要一个不同的格式,你想要第三行,而不是右列,并读取一个正确宽度的实数。

open(newunit=iu, ,file='matrix.txt',status='old', form= 'formatted', action='read', &
        iostat=io_error)
...    
read(iu, '(2/,t16,e14.0)', iostat=io_error) a

这会跳过两个记录,转到第16列并读取一个14个字符宽的实数。检查列号是否正确。你总是希望.0输入实数,否则会发生奇怪的事情(在这里用其他Q / A处理)。

而不是2/,您可以执行两次read(iu, *)

您可以使用newunit=iu这样的固定数字代替unit=iuunit=11,以实现向后兼容。

答案 1 :(得分:0)

如果你想了解它,我会推荐一种三管齐下的方法

1)阅读:E8.1可能是正确的,但它看起来更像是E8.5或1PE12.5,但你不需要它。还会在阅读中发生什么......?它是标量a中的第一个,第二个还是第三个数字?

我没有编译它,因此它仅作为概念性示例提供。

real :: a, b
Integer :: c

open(unit=22,file='matrix.txt',status='old', form= 'formatted', action='read', &
    iostat=io_error)
  if ( io_error == 0) then

        read(22,*) a, b, c
        100 format(1x,2/,E8.1)
         write(*,*) 'a=',a,' b=',b,' c=',c
   else
       write(*,*) 'unable to open file', &
                   io_error,' failed'
   end if

close(unit=22)

2)数组:您提到了第三行和第二行/列。

real, dimension(3,100) :: a
Integer                :: I = 0

open(unit=22,file='matrix.txt',status='old', form= 'formatted', action='read', &
    iostat=io_error)
  if ( io_error == 0) then
        I = I + 1
        read(22,*) a(:, I)
        100 format(1x,2/,E8.1)
         write(*,*) 'a(:,',I,')', a(:, I)
   else
       write(*,*) 'unable to open file', &
                   io_error,' failed'
   end if

close(unit=22)

3)格式和Newunit :尝试使用Vladimir的新单元以及格式化的读取。 (通常我使用未格式化的读取和格式化写入)