当我运行简单代码时:
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
文件并再次运行,那就没关系了。有谁知道为什么程序无法打开现有文件?
答案 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