编译器正在顺利进行,但是
program.exe name_of_data
抛出:error in opening file, iostat=2.
数据与程序位于同一位置,第一行是整数,其余为实数。
program task2a
implicit none
character(len=100) :: dateiname
integer :: ierror, n, read_error
real(kind=8) :: x, sum, average, sd, squaresum
sum=0.0
squaresum=0.0
if (command_argument_count() < 1) then
write(*,*) " FEHLER : zu wenige Argumente "
stop
else
call get_command_argument (1, dateiname)
end if
open(unit=12, file= dateiname, status= 'old', action='read', iostat=ierror)
if (ierror==0) then
read(12,*, iostat=read_error) n
if (read_error>0) then
write(*,*) "error in file"
stop
else
do
read(12,*,iostat=read_error) x
if (read_error>0) then
stop "error in file"
else if (read_error<0) then
exit !end of file
else
sum= sum +x
squaresum=squaresum+x**2
end if
end do
end if
else
write(*,*) "Error: opening file, number:", ierror
stop
end if
close(unit=12)
average= sum/n
sd=sqrt((squaresum-(sum**2)/n)/(n-1))
write(*,*) "average:", average
write(*,*) "standard deviation:", sd
end program task2a
答案 0 :(得分:0)
没有足够的信息来回答问题。
很显然,它无法打开文件进行读取,但是如果没有更多信息,我们将无法确切告知您出了什么问题。
以下是一些想法:
文件名包含空格或其他特殊字符,导致其不正确地传递给程序。例如,如果文件名为data file.txt
,则调用
$ ./program data file.txt
将传递data
作为第一个命令参数,并将file.txt
作为第二个命令参数。
文件名太长。您已经给了自己100个字符的长度,但是如果您输入完整路径(可能包括unicode字符),可能还不够。
找出正在发生的事情的最好方法是使程序更加健谈:
除iostat
参数外,几乎所有现代Fortran编译器(我认为它是Fortran 2003标准)都了解iomsg
参数:
character(len=100) :: io_emsg
...
open(unit=12, file=dateiname, status='old', action='read', &
iostat=ierror, iomsg=io_emsg)
if (ierror /= 0) then
print *, "Error opening file ", trim(dateiname)
print *, trim(io_emsg)
stop
end if
iomsg
是返回可读错误消息的字符串。