Iostat имеет значение 2 при открытии файла - PullRequest
2 голосов
/ 05 мая 2019

Компилятор проходит без проблем, но 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 голосов
/ 07 мая 2019

Недостаточно информации, чтобы ответить на вопрос.

Очевидно, что не удается открыть файл для чтения, но без дополнительной информации мы не сможем точно сказать вам, что не так.

Вот несколько идей:

  • Вопреки вашим ожиданиям, программа не выполняется в рабочем каталоге, содержащем файл.
  • Имя файла содержит пробел или другой специальный символ, который вызывает его неправильную передачу в программу. Например, если файл называется data file.txt, то вызов

    $ ./program data file.txt
    

    передаст data в качестве первого аргумента команды и file.txt в качестве второго.

  • Имя файла слишком длинное. Вы дали себе длину 100 символов, но если вы введете полный путь, возможно, включая символы Юникода, этого может быть недостаточно.

  • Файл существует, но у вас нет прав на чтение.

Лучший способ узнать, что происходит, - сделать программу более разговорчивой:

Помимо аргумента 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 - строка, которая возвращает читаемое сообщение об ошибке.

...