【问题标题】:Fortran I/O, first read is EOF?Fortran I/O,首先读取的是EOF?
【发布时间】:2013-03-10 13:19:50
【问题描述】:

我正在尝试使用一些旧的 FORTRAN 代码和一些新的 Java 代码,这些代码在 Windows(作为 exe)中工作,但在 OS X 中不工作。我尝试在 eclipse 中构建它,我得到了

make: *** [all] Segmentation fault: 11

所以我去终端并这样做,即使是不同的编译器但仍然是相同的结果:

运行 OS X 10.7.5 和 gfortran-4.2 使用标准的 -c 和 -o 命令

Program foo
open(unit = 1, file = 'variables.txt',IOSTAT= iost)
    write(*,*)iost
    read(1,*) P
    write(*,*)P
...
end program foo

程序手动构建,但输出为:

0
At line 13 of file Cubic42.f
Fortran runtime error: End of file

我也看到了这个错误:

list in: end of file
apparent state: unit 88 named variables
last format: list io
lately reading sequential formatted external IO
Abort

显示IOSTAT返回0,说明文件好? 但它不会读取文件,即使我将 unit# 更改为 88.. 并且即使我将 CR 更改为 mac、windows 或 unix。

这似乎只是输入/输出的问题,例如,如果我对变量进行硬编码,程序就可以工作。

关于如何解决这个问题的任何想法? 提前致谢。

编辑1 这是 variables.txt 文件

-9999
15.6
500
150.9
48.98
0.000

最后有个回车,我把-9999改成正数也没关系

编辑2

我从目录中删除了文本文件并将 .f 重新制作为如下所示:

program foo
   implicit none
    real a, b, c, d
   open(unit = 1, file = 'variables.2txt', action='write')
   write(1, *) -6666
   write(1, *) 6.15
    write(1, *) -321
    write(1, *) 5.16
   close(1)

    open(unit = 2, file = 'variables.2txt', action='read',form='FORMATTED')
    read(2, *) a
            write(*,*) a
    read(2, *) b
            write(*,*) b
    read(2, *) c
            write(*,*) c
    read(2, *) d
            write(*,*) d
    close(2)

end program foo

然后我编译它。
输出是:

  -6666.000    
   6.150000    
  -321.0000    
   5.160000 

正如预期的那样,但是 variables.2txt 无处可寻!我很困惑,请帮忙。

编辑3 我找到了幻影文件。它位于 /users/me/phantom.txt 那么问题来了,如何让文件和可执行文件保存在同一目录下呢?

【问题讨论】:

  • 能否显示输入文件的内容(前几行)?
  • 输入文件在edit1

标签: fortran fortran90 gfortran fortran77 fortran95


【解决方案1】:

我收到了与您的非常相似的错误消息

           0
At line 4 of file proba.f (unit = 1, file = 'variables.txt')

在 Linux 上使用文件 variables.txt 运行代码时,我根据旧的 MAC 约定将行尾字符显式设置为 ^M(而不是 Unix 的 ^J)。所以,我想,这是一个 EOL 约定问题。您最终可以尝试将两行写入文件并调查该文件,以确定 gfortran 期望在您的系统上使用哪种 EOL 约定:

program foo
  implicit none
  open(unit = 1, file = 'variables.txt', action='write')
  write(1, *) -9999
  write(1, *) 15.6
  close(1)
end program foo

另外,我肯定会选择更新的 gfortran 编译器(当前稳定版是 4.7.2 版)。

【讨论】:

  • 好的,这似乎效果更好,但是,文本文件既没有创建(如果丢失)也没有重写(如果存在)非常感谢!
  • 好的,现在进行一些修改,我发现在运行该程序后,创建了一个名为 variables.txt 的文件,只有两个值,现在我的后续尝试(使用不同的同名文本文件)当我知道有更多条目时,两次读取后失败(EOF)。
  • 我现在遇到了一个非常奇怪的小问题:文本文件似乎被写入和读取但不可见。更新在edit2中
  • 如果没有明确的路径,文件将在当前工作目录中创建。如果您从终端执行程序,那么当您输入程序名称时,这就是您所在的目录。如果您通过单击 GUI 通过 GUI 启动程序,这取决于您的系统设置。但是,您可以使用显式路径(例如open(unit=1, file='/directory/of/executable/variable.txt' ...)打开文件,然后它将在指定目录中创建。
  • 我一直在寻找一种方法来设置可执行目录的路径,但我认为 FORTRAN 可能不是一个很好的方法。相反,您认为如果我使用 Java(调用程序)来编写变量.txt 第一行的路径会更好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2013-09-09
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多