Fortran Coder

楼主: mao
打印 上一主题 下一主题

[文件读写] open打开已有文件出错,segmentation fault, invalid memory reference

[复制链接]

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

11#
发表于 2018-2-5 13:40:02 | 只看该作者
本帖最后由 pasuka 于 2018-2-5 13:42 编辑
mao 发表于 2018-2-5 13:35
谢谢。
看过OPEN的说明,我的代码应该是对的吧,现在的问题是:Status=‘OLD’时候, 文件存在会出错。 ...

文档不是说了吗?'OLD'-- The file already exists (nonexistence is an error). 文件若是不存在则报错
程序代码没有问题,不能推导出程序要打开的文件及其路径也没问题啊?
再说,Stack Overflow上面的帖子已经给出参考代码,为啥不试着跑跑呢?
师傅领进门,修行在自身。

17

帖子

2

主题

0

精华

入门

F 币
94 元
贡献
58 点

规矩勋章

12#
 楼主| 发表于 2018-2-5 13:54:20 | 只看该作者
pasuka 发表于 2018-2-5 13:40
文档不是说了吗?'OLD'-- The file already exists (nonexistence is an error). 文件若是不存在则报错
程 ...

谢谢回复,我试过如下代码。
文件不存在时候,新建和写入都正常。再执行一次(此时文件存在,刚新建的)就出错。所以路径应该是没有问题的,并且(io=0)这个文件是正常关掉的,下次打开不应该有问题的么。

[Fortran] 纯文本查看 复制代码
program main
  implicit none
  logical :: exist
  integer(kind=4):: a(20), i, io
  a=(/(i,i=1,20)/)
  inquire(file="te.dat", exist=exist)
  if (exist) then
    write(*,*) exist
    open(10, file="te.dat", status="old")
    read(10, *) a
    close(10)
  else
    write(*,*) exist
    open(10, file="te.dat", status="new")
    write(10, *) a
    close(10,iostat=io)
    write(*,*) io
  end if
  write(*,"(10I3)") a
end

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

13#
发表于 2018-2-5 14:25:24 | 只看该作者
mao 发表于 2018-2-5 13:54
谢谢回复,我试过如下代码。
文件不存在时候,新建和写入都正常。再执行一次(此时文件存在,刚新建的) ...

MSYS2 + Gfortran 7.3.0 测试正常
[Fortran] 纯文本查看 复制代码
program main
implicit none
logical:: exist
integer:: flag
character(len=8):: fn="demo.txt"
  
inquire(file=fn, exist=exist)
if (exist) then
    write(*,*)"File already exists."
    open(newunit=flag, file=fn, status="old")
    write(flag, *)"Rewrite file."
    close(flag)
else
    write(*,*)"File does not exist"
    open(newunit=flag, file=fn, status="new")
    write(flag, *)"Create file."
    close(flag)
end if
end program

17

帖子

2

主题

0

精华

入门

F 币
94 元
贡献
58 点

规矩勋章

14#
 楼主| 发表于 2018-2-5 15:16:52 | 只看该作者
本帖最后由 mao 于 2018-2-5 15:18 编辑
pasuka 发表于 2018-2-5 14:25
MSYS2 + Gfortran 7.3.0 测试正常
[mw_shl_code=fortran,true]program main
implicit none

谢谢。

我也运行了你的代码,一样的: 第一执行次文件不存在,新建写入正常,第二次执行文件存在,segmentation fault.

这就是目前我遇到的问题:
(1) 文件存在时候,open出错。
(2) 同样的代码大家可以测试通过(环境包括CodeBlocks- by VVT,MSYS2+Gfortran by pasuka)
(3) 我用FTN95+plato也能实现
(4) 但是我在3台不同电脑上用 CodeBlocks+GNU Fortran Complier, 都有问题。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

15#
发表于 2018-2-5 15:25:16 | 只看该作者
本帖最后由 pasuka 于 2018-2-5 15:31 编辑
mao 发表于 2018-2-5 15:16
谢谢。

我也运行了你的代码,一样的: 第一执行次文件不存在,新建写入正常,第二次执行文件存在,segmen ...

gfortran版本呢?CB自带是4.9系列吧?即使5.0版也有反馈出错的
https://sourceforge.net/p/tdm-gcc/bugs/270/



17

帖子

2

主题

0

精华

入门

F 币
94 元
贡献
58 点

规矩勋章

16#
 楼主| 发表于 2018-2-5 15:54:28 | 只看该作者
pasuka 发表于 2018-2-5 15:25
gfortran版本呢?CB自带是4.9系列吧?即使5.0版也有反馈出错的
https://sourceforge.net/p/tdm-gcc/bugs/2 ...

谢谢。

现在看起来极有可能是这个编译器版本问题。
弱弱地问下:我不太了解版本,我的版本应该是5.1.0,是么(如下)?我再仔细看下你发的连接,谢谢。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

17#
发表于 2018-2-5 16:23:45 | 只看该作者
mao 发表于 2018-2-5 15:54
谢谢。

现在看起来极有可能是这个编译器版本问题。

命令行下面执行gcc -v或者gfortran -v就能查看版本号

17

帖子

2

主题

0

精华

入门

F 币
94 元
贡献
58 点

规矩勋章

18#
 楼主| 发表于 2018-2-5 18:14:36 | 只看该作者
pasuka 发表于 2018-2-5 16:23
命令行下面执行gcc -v或者gfortran -v就能查看版本号

谢谢,我先回去下载个新编译器看看,非常感谢。

17

帖子

2

主题

0

精华

入门

F 币
94 元
贡献
58 点

规矩勋章

19#
 楼主| 发表于 2018-2-6 12:54:07 | 只看该作者
谢谢 VVT 和 pasuka 的回答。目前问题已经解决了: 是gFortran编译器版本的问题,如pasuka所说。

我从MinGW网站下载安装管理器,里面的版本是6.3.0版本,测试可以正常运行。

另请教下 pasuka,为啥我从MinGW下载的版本是6.3.0, 而你那边有更新的7.3.0版本?谢谢,

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

20#
发表于 2018-2-6 14:05:03 | 只看该作者
mao 发表于 2018-2-6 12:54
谢谢 VVT 和 pasuka 的回答。目前问题已经解决了: 是gFortran编译器版本的问题,如pasuka所说。

我从MinG ...

不客气
我不用CB这类IDE做Fortran程序开发,写Makefile也挺好啊
安装新版gcc可以用MSYS2
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 08:33

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表