"分段错误"打开现有文件时

时间:2016-04-01 18:54:33

标签: segmentation-fault fortran

当我运行简单代码时:

program summation
implicit none
integer :: sum, a, b

print*, "This program performs summations. Enter 0 to stop."

!open(unit=10, file="SumData.DAT", status='replace', action='write',iostat=b, err=100)
!100 continue
!write(*,*) b

open(unit=10, file="SumData.DAT", status='replace', action='write')

sum = 0

do
 print*, "Add:"
 read*, a
 if (a == 0) then
  exit
 else
  sum = sum + a
 end if
  write(10,*) a
end do

print*, "Summation =", sum
write(10,*) "Summation =", sum
close(10)

end

当我第一次运行此代码时,它没问题,它生成了SumData.dat文件。但是当我再次运行它时,它将停在open命令并显示以下错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  ffffffffffffffff
#1  ffffffffffffffff
#2  ffffffffffffffff
#3  ffffffffffffffff
#4  ffffffffffffffff
#5  ffffffffffffffff
#6  ffffffffffffffff
#7  ffffffffffffffff
#8  ffffffffffffffff
#9  ffffffffffffffff
#10  ffffffffffffffff
#11  ffffffffffffffff
#12  ffffffffffffffff
#13  ffffffffffffffff
#14  ffffffffffffffff
#15  ffffffffffffffff
#16  ffffffffffffffff
#17  ffffffffffffffff
#18  ffffffffffffffff

如果我删除了SumData.dat文件并再次运行,那就没关系了。有谁知道为什么程序无法打开现有文件?

2 个答案:

答案 0 :(得分:1)

确切地指定您要对文件执行的操作始终是一个好主意:

open(unit=10, file="SumData.DAT", status='replace', action='write')

使用此选项,您可以指定尝试打开文件进行写入,必要时替换它。如果你没有指定status,编译器可以自由地做任何它认为最好的事情 - 这可能会导致你的失败。 action specifier也是如此。

此外,您应该使用iostat=<some integer var>来检查open操作的返回值。然后,您可以在体验时避免丑陋的运行时错误。

答案 1 :(得分:1)

我在尝试使用gfortran版本5.1.0时遇到了同样的问题,该版本随Code :: Blocks 17.12一起提供。根据{{​​3}},它似乎是版本的问题。

  

[...]无论问题是什么,它都是用GCC 5.2解决的。

要在main.f90中重新创建的代码:

program main
  IMPLICIT NONE
  OPEN(10, FILE='tmp.dat', STATUS='OLD', ACTION='WRITE')
  CLOSE(10)
end program main

编译
gfortran -Wall -o a.out main.f90

并正在运行

touch tmp.dat && ./a.out

返回

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  ffffffff