【问题标题】:Fortran runtime error: End of fileFortran 运行时错误:文件结束
【发布时间】:2018-02-25 03:38:32
【问题描述】:

我试图了解 READ 语句在 Fortran 中的工作原理。为此,我编写了以下简单程序:

program main 
integer a,b,c

open(unit=10,file='test.txt',status='old')
read(10,*)a,b,c
print*,a,b,c
close(10)
end program main

我在终端上运行它(使用 Mac):gfortran Main.f95;打开a.out

我收到以下错误:在文件 Main.f95 (unit = 10, file = 'test.txt') 的第 5 行 Fortran 运行时错误:文件结束

我在网上寻找解决方案,并提出在 READ 说明符中添加 IOSTAT=... 的建议,如下所示:

program main 
integer a,b,c,IOstatus

open(unit=10,file='test.txt',status='old')
read(10,*,IOstat=IOstatus)a,b,c
print*,a,b,c,IOstatus
close(10)
end program main

当我这样做时,程序运行成功。但是,打印命令显示“2 0 1 -1”,这是错误的,因为 test.txt 文件包含“1,2,3”。

我试过在这里和那里调整一些东西,但没有用。我正在尝试做一些(我认为)应该非常简单的事情:从 .txt 文件中读取整数列表。任何关于我做错了什么的帮助将不胜感激。

【问题讨论】:

  • 您使用的是什么编译器版本?我可以使用 gfortran 5.4 成功运行您的初始代码
  • 如您所见,iostat 在这里为您所做的一切都是抑制非常清晰的错误消息,而是给您一个整数标志 -1,指示某种读取错误。
  • 您确定您的文本文件实际上是文本文件吗?你用什么编辑器?
  • 将此评论视为最佳实践的旁注:始终使用implicit none。声明变量时,双冒号是可选的,但很常见 (integer :: a,b,c)。如果您声明具有某种属性的变量/类型,则需要 :: (integer, dimension(:), allocatable :: a)。
  • 我使用 TextEdit 创建了文本文件。在 Finder 上,文件类型显示为“纯文本”。另外,我添加了“隐式无”,但我仍然收到相同的错误消息。我的 gfortran 版本是 6.3。

标签: fortran gfortran


【解决方案1】:

我认为您的问题与 text.txt 文件有关,而不是与 Fortran 代码有关。尝试在其中添加一个行尾字符(回车)。我已经使用 gfortran 5.4 成功运行了您的原始代码。

查看this相关帖子了解更多详情。

【讨论】:

  • 感谢您的评论。我的 test.txt 文件只是“1,2,3”。我现在在“3”的末尾添加了一个输入。它仍然给我同样的错误。你用的是什么文本文件?也许是因为我的 gfortran 版本?我有 6.3 版。
  • 我使用了与您描述的相同的文本文件:1,2,3,并在 3 的末尾输入。保存文件时,您的文本编辑器可能会做一些奇怪的事情。用另一个编辑器试试,看看会发生什么。
  • 顺便说一句,你不是在文本文件中包含字符"对吗?
  • 我现在正在尝试使用 Word。当我保存为纯文本 (txt) 时,它给了我几个选项: 1. 文本编码:Mac OS、MS-DOS 或其他编码(包括一大堆选项)。 2. 选项:插入换行符、允许字符替换、添加双向标记、结束行:仅 CR、CR/LF、仅 LF 或 LF/CR。您知道要选择哪些选项吗?另外,我确实不包括 " 字符。
  • 您可以在终端中使用 nano,它应该可以正常工作。
【解决方案2】:

您的程序正在做正确的事情。简单地测试 iostat 可以防止程序崩溃。如果到达文件末尾,则 IOstatus 设置为负数(在本例中为 -1)。如果存在读取错误,则 IOstatus 设置为正数,这在您的情况下没有发生。因此,您的 print 语句以 -1 结尾,这是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 2017-11-15
    • 2016-10-12
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多