打开文件时,Iostat的值为2

时间:2019-05-05 16:41:52

标签: fortran gfortran

编译器正在顺利进行,但是 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

1 个答案:

答案 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是返回可读错误消息的字符串。