在 Fortran 中逐行读取逗号分隔的文本文件
Posted
技术标签:
【中文标题】在 Fortran 中逐行读取逗号分隔的文本文件【英文标题】:Reading a comma-delimited text file line-by-line in Fortran 【发布时间】:2011-09-22 09:31:39 【问题描述】:我是 Fortran 新手。我希望能够读取文本文件并将其内容保存在各个变量中。我找到了一个非常有用的 Fortran 教程 (http://www.math.hawaii.edu/~hile/fortran/fort7.htm#read),我正在尝试遵循其中列出的示例之一。具体来说,我制作了一个名为 data.txt 的文本文件,其中包含以下文本:
1.23, 4.56, 7.89
11, 13, "Sally"
我已将此文本文件保存在当前目录中。然后,我创建了一个包含以下代码的文件 test.f90(也将其保存在我的当前目录中):
PROGRAM test
IMPLICIT NONE
REAL :: x, y, z
INTEGER :: m, n
CHARACTER first*20
OPEN(UNIT = 7, FILE = "data.txt")
READ(7,*) x, y, z
READ(7,*) m, n, first
PRINT *, x
PRINT *, y
PRINT *, z
PRINT *, m
PRINT *, n
PRINT *, first
END PROGRAM test
我正在使用 GNU Fortran 编译器,我认为它至少包含了 Fortran95 之前的功能,包括 Fortran95。上面的代码似乎可以编译,至少使用默认设置)。但是当我运行生成的可执行文件时,我收到以下错误消息:
At line 10 of file test.f90 (unit = 7, file = 'data.txt')
Fortran runtime error: End of file
第 10 行是 READ(7,*) m, n, first 行。你能帮我看看我在上面的代码中做错了什么吗?
【问题讨论】:
用另一个单元号 ( > 10 ) 试试。也许您的编译器将单元 7 用于预连接设备。 @eriktous:非常感谢您抽出宝贵时间,但不幸的是,这并不能解决问题(至少在我使用 15 为单位时)。不过,谢谢您的建议;很高兴知道编译器可以将 10 或更少的单位用于预连接的设备。我会记住这一点。谢谢! 【参考方案1】:我可以重现您的确切错误消息和正确的输出。我在 Windows 上使用 gfortran,并使用记事本创建数据文件。 如果您使用换行符终止第二个数据行(通过按 Enter 键),程序将显示正确的输出;如果你不终止它,它会在执行过程中显示错误。
基本上,运行时会尝试读取一行,但在到达行尾之前遇到文件结束符。
【讨论】:
【参考方案2】:当我使用您的示例程序和您的示例数据时,它可以工作!恭喜!输出是:
1.2300000
4.5599999
7.8899999
11
13
Sally
要猜测它不适合您的可能原因,有时 Fortran 可执行文件可能对行尾很敏感,需要操作系统的正确行终止符,包括数据文件的最后一行。相反,许多编辑器会默默地转换行尾。我经常在使用 Microsoft 程序编写的文件时遇到这个问题。
【讨论】:
我确实最初使用 Microsoft 编辑器制作了我的文本文件:Windows XP 上的记事本。刚才我创建了一个包含相同文本的新文本文件,但这次是使用 XEmacs 编写的,单位值是 16 而不是 7 或 15。不幸的是,它仍然无法运行。只是出于好奇,你推荐什么文本编辑器?另外,是否可能某些 Fortran 方言具有“终结符”?例如,我知道在 C 中,我认为每个文本文件都必须以“\0”或空指针结尾。 XEmacs 也有一些特别之处。当我使用 vi 创建文本文件时,它可以工作,并且得到与您完全相同的输出。我正在使用 GNU Fortran 编译器 (gfortran);你也在用吗? 我在 Mac OS X 中使用 gfortran。无论使用何种编辑器,可执行文件都需要 OS 的行终止符位于行尾,包括最后一行。正如@eriktous 所写,请务必使用 Enter 来获取行终止符。 Microsoft 程序经常使用错误的终止符,这也会导致不明显的问题。 我遇到了同样的问题@M.S.B,除了我使用 Java 创建 FORTRAN 读取的文件并且它在第一次读取时发生。有什么想法吗?【参考方案3】:对于某些编译器,在数据的最后一行之后添加一个新行很重要。例如 gfortran 是一个需要它的编译器,它是非常合乎逻辑的。 Sun (Oracle) 编译器不需要那个。
【讨论】:
这不是和我说的基本一样吗? 是的。快速阅读后我没有意识到。我主要阅读关于不同编辑器的稍微误导性的讨论。以上是关于在 Fortran 中逐行读取逗号分隔的文本文件的主要内容,如果未能解决你的问题,请参考以下文章