我正在尝试从文件中读取二进制数据。
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'解决了这个问题。感谢所有的帮助...答案 0 :(得分:0)
Fortran的二进制I / O非常棘手。我建议你使用流来获得更像C的行为。可以找到一个很好的介绍here。
此页面可归纳如下:
写作:
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
答案 1 :(得分:0)
奇怪的是,错误是“文件结束”而不是“记录结束”。您确定要打开正确的文件吗?您是否输出了第一次读取时读取的值,看它们是否正确?如有必要,使用十六进制编辑器确定预期值。
使用十六进制编辑器检查文件,查看记录长度是多少,并与读取的预期长度进行比较。自Fortran编写以来,每条记录都包含一个前后值,其记录长度通常为4个字节。正如一些注释所暗示的那样,您可以通过编写测试文件或检查其文档来确定文件中记录长度值的长度,并与当前编译器使用的值进行比较。有些编译器有编译选项来改变使用的长度。典型的是4个字节,但有时使用8个字节。