如何从FORTRAN中的文本文件中总结一列?

时间:2017-11-08 00:45:11

标签: fortran

我想用我定义格式的文本文件中的整个列。我能够阅读和打印我的文本文件,但总结有麻烦。这是我的代码:

program sum
implicit none
character, Dimension(259)::a,b
real,Dimension(259)::c
integer, Dimension(25)::d
integer::e, xyz

!read the existing file
open(unit=2,file="vishal.rtp_entry",status="old",action="read")

read(2,*)
read(2,*)
11 format(F6.3)
do e=1, 259
    read(2,*)a(e),b(e),c(e),d(e)

    xyz = sum(\c(e)\)
    write(*,11)xyz(e)
    end do

close(2)

end program sum

我需要在哪里更正我的代码?感谢

1 个答案:

答案 0 :(得分:2)

您应该看到的第一件事是,对于循环的每次迭代(即每个输入行),您都在运行sumwrite(*,11)

这几乎肯定不是你想要的。

由于您已经存储了所有值,因此您也可以在循环之后构建总和:

do e = 1, 259
    read(2, *) a(e),b(e),c(e),d(e)
end do
xyz = sum(c)
write(*, 11) xyz

这让我想到了下一点:xyz被声明为整数标量,但是在write语句中,你将它称为数组。那肯定会失败。

接下来,xyz是一个整数,但c数组是real的数组 - 我认为你应该坚持使用。{/ p>

然后,你正在使用unit=2这是危险的,因为不同的编译器可能会将单元2用于其他事情。我通常坚持使用大于10的数字,或者甚至更好地使用newunit=<variable>,这意味着编译器正在为我选择一个好的单元。

但是,如果您只想要一个总和,那么您可以比这更容易(并且输入文件的行数可以更灵活):

program my_sum
     implicit none
     character :: a, b
     real :: c
     integer :: d, e
     real :: accumulator
     integer :: ios ! Status for read commands to test for EOF

     open(unit=11, file="vishal.rtp_entry", status="old", action="read")

     accumulator = 0.0

     do
         read(11, *, iostat=ios) a, b, c, d, e
         if (ios /= 0) exit
         accumulator = accumulator + c
     end do

     close(11)

     write(*, '(F6.3)') accumulator

end program my_sum