0

我正在尝试从文件中读取二进制数据。

INTEGER MAX_LAT,MAX_LON,MAX_SHELL,MAX_ORB_PNTS
INTEGER YYYY1,MON1,DD1,HH1,MIN1,DOY1
REAL*8 SEC1

OPEN(20,FILE=INPUTFILE,STATUS='OLD',FORM='UNFORMATTED')
READ(20)MAX_LAT,MAX_LON,MAX_SHELL,MAX_ORB_PNTS
...
READ(20)YYYY1,MON1,DD1,DOY1,HH1,MIN1,SEC1
...
CLOSE(20)

在两者之间(我放'...')我只是在做一些字节交换和打印读取的数据。

如果我运行此代码,第一个 READ 工作正常。所以我确信输入文件在正确的位置。但是我在第二个 READ 的行中收到此错误:

Fortran runtime error: End of file

我的变量的数据类型与编写文件的程序中的相同。无论如何,文件> 3000 KB,所以我很确定在读取四个整数值后无法到达文件末尾。

编辑:正如下面的评论中提到的,问题是字节序。OPEN 语句中的一个简单的 CONVERT='SWAP' 解决了这个问题。感谢所有的帮助...

4

2 回答 2

0

Fortran 的二进制 I/O 可能非常棘手。我建议您将流用于更像 C 的行为。可以在这里找到一个很好的介绍。

这个页面可以总结如下:

写作:

OPEN(UNIT=11, FILE="file.name", STATUS="NEW", ACCESS="STREAM")
WRITE(11) your,data1,variables
WRITE(11) more,data2

阅读:

OPEN(UNIT=22, FILE="file.name", STATUS="OLD", ACCESS="STREAM")
ipos = 1
READ(22,POS=ipos) your,data1,variables
ipos = IPOS + SIZEOF(your) + SIZEOF(data1) + SIZEOF(variables)
READ(22,POS=ipos) more,data2
于 2012-05-04T12:25:24.270 回答
0

奇怪的是错误是“文件结束”而不是“记录结束”。你确定你打开的是正确的文件吗?您是否输出了您在第一次读取时读取的值以查看它们是否正确?如有必要,使用十六进制编辑器来确定预期值。

使用十六进制编辑器检查文件,查看记录长度,并与读取的预期长度进行比较。由于由 Fortran 编写,每条记录都将包含一个具有记录长度的前值和后值,通常为 4 个字节。正如一些评论所暗示的,您可以通过编写测试文件或检查其文档来确定文件中记录长度值的长度,并与当前编译器使用的长度进行比较。一些编译器有编译选项来改变使用的长度。4 字节是典型的,但有时使用 8 字节。

于 2012-05-04T15:25:40.480 回答