我想用我定义格式的文本文件中的整个列。我能够阅读和打印我的文本文件,但总结有麻烦。这是我的代码:
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
我需要在哪里更正我的代码?感谢
答案 0 :(得分:2)
您应该看到的第一件事是,对于循环的每次迭代(即每个输入行),您都在运行sum
和write(*,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