我正在阅读的文件中有3列,我想平均每列并取std。代码现在编译,但没有打印任何内容。
这是我的代码:
program cardata
implicit none
real, dimension(291) :: x
intEGER I,N
double precision date, odometer, fuel
real :: std=0
real :: xbar=0
open(unit=10, file="car.dat", FOrm="FORMATTED", STATUS="OLD", ACTION="READ")
read(10,*) N
do I=1,N
read(10,*) x(I)
xbar= xbar +x(I)
enddo
xbar = xbar/N
DO I =1,N
std =std +((x(I) -xbar))**2
enddo
std = SQRT((std / (N - 1)))
print*,'mean:',xbar
print*, 'std deviation:',std
close(unit=10)
end program cardata
我对此很新,任何意见都将不胜感激。
car.dat
的示例:
date odometer fuel
19930114 298 22.4
19930118 566 18.1
19930118 800 18.9
19930121 960 15.8
19930125 1247 19.8
19930128 1521 17.1
19930128 1817 19.8
19930202 2079 18.0
19930202 2342 10.0
19930209 2511 16.4
19930212 2780 16.7
19930214 3024 19.0
19930215 3320 17.7
19930302 3560 16.4
19930312 3853 18.8
19930313 4105 18.5
答案 0 :(得分:0)
根据您在评论中提供的car.dat
,令人惊讶的是该计划没有显示任何内容。当我运行它时,它显示一个非常明确的运行时错误:
$ gfortran -o cardata cardata.f90
$ ./cardata
At line 12 of file cardata.f90 (unit = 10, file = 'car.dat')
Fortran runtime error: Bad integer for item 1 in list input
你似乎在没有真正理解它的作用的情况下从另一个例子中复制代码。在您编写代码时,代码希望文件car.dat
采用特定格式:首先是integer
,它对应于文件中的项目数,然后是real
个5
1.2
4.1
2.2
0.4
-5.2
每行。所以像这样:
N
但是使用您的示例,第一行包含文本(即不同列的描述),并且当它尝试将其解析为整数(read(10, *) date(I), odometer(I), fuel(I)
)时,它必须失败。
我不会给你完整的例子,因为我有一种唠叨的怀疑,即这是某种你应该从中学习的功课。但这里有一些提示:
您可以轻松地每行读取多个值:
date
我在此假设与您的计划不同,odometer
,fuel
和date
是数组。 odometer
和integer
可以是fuel
,但real
必须是double precision
(或character(len=64)
,但这些不是必需的值)。
你需要跳过第一行才能开始。您可以将该行读入虚拟len=64
变量。 (我选择N
,但你可以选择任何其他你感到自信的长度,但它应该足够长,以实际包含整行。)
最棘手的一点是如何获取N = 0
readloop : do
read(10, fmt=*, iostat=ios) date(N+1), odometer(N+1), fuel(N+1)
if (ios /= 0) exit readloop
N = N + 1
end do readloop
,因为它没有在文件的开头给出。你能做的是:
INTEGER :: ios
当然,您需要在程序开头声明date
。这将尝试将值读入数组的下一个位置,如果它失败(通常是因为它已到达文件的末尾),它将结束。
请注意,这再次要求odometer
,fuel
和Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0
成为数组,而且要成为足以包含所有值的数组。如果您无法保证,我建议您阅读allocatable arrays以及如何dynamically increase their size。