如何读取fortran语言写的二进制文件?

wupeihao 2005-08-23 12:45:28
谢谢!
...全文
884 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wupeihao 2005-10-14
  • 打赏
  • 举报
回复
wupeihao 2005-09-28
  • 打赏
  • 举报
回复
这么用心。
非常感谢。
wupeihao 2005-09-25
  • 打赏
  • 举报
回复
非常感谢。
VB确实没办法做到吗?
crycoming 2005-09-25
  • 打赏
  • 举报
回复
我加了注释,自己大概是能看懂了吧,7年前学的考了试就扔了,忘得差不多了
INPUT.TMP for FMTWTH
----+----1----+----2----+----3----+----4----+----5----+----6----+----7
WORD SIZE = 2 FILE TYPE = 2
WORD SIZE = 1 MEANS 60-BIT, 2 MEANS 30-BIT
FILE TYPE = 1 MEANS OLD, 2 MEANS NORMAL (NO SOLAR DATA),
3 MEANS THE DATA HAS SOLAR DATA
FMTWTH Program Listing
PROGRAM FMTWTH
C
C THIS PROGRAM READS A FORMATTED WEATHER FILE (WEATHER.FMT)
C AND A FORMATTED INPUT FILE (FMTWTH.INP) AND WRITES A
C PACKED BINARY DOE2 WEATHER FILE (WEATHER.BIN)
C
C ///本程序读出天气文件和录入的数据文件FMTWTH.INP,将处理结果输出到二进制文件WEATHER.BIN中
DIMENSION CLN(12),GT(12),MDAYS(12),IDAT(1536),IWDID(5)
C ///定义数组 注意:I打头的类型为整数,其它不记得了
C
DATA MDAYS / 31,28,31,30,31,30,31,31,30,31,30,31 /
C ///初始化数组,这是一年中每个月的天数
C
OPEN(UNIT=12,FILE='INPUT.DAT')
OPEN(UNIT=11,FILE='WEATHER.FMT')
OPEN(UNIT=10,FILE='WEATHER.BIN',FORM='UNFORMATTED')
C ///打开文件,相当于VB的open file as #12 这个数值用来操作文件
C
C IWSZ WORD SIZE 1 = 60-BIT, 2 = 30-BIT
C IFTYP FILE TYPE 1 = OLD, 2 = NORMAL (NO SOLAR),
C 3 = THE DATA HAS SOLAR
C IWDID LOCATION I.D.
C IWYR YEAR
C WLAT LATITUDE
C WLONG LONGITUDE
C IWTZN TIME ZONE NUMBER
C IWSOL SOLAR FLAG FUNCTION OF IWSZ + IFTYP
C CLN CLEARNESS NO.
DOE-2.1E Documentation Update: Weather Processor
Revised April, 1999 VIII.8
C GT GROUND TEMP. (DEG R)
C KMON MONTH (1-12)
C KDAY DAY OF MONTH
C KH HOUR OF DAY
C WBT WET-BULB TEMP (DEG F)
C DBT DRY-BULB TEMP (DEG F)
C PATM PRESSURE (INCHES OF HG)
C CLDAMT CLOUD AMOUNT (0 - 10)
C ISNOW SNOW FLAG (1 = SNOWFALL)
C IRAIN RAIN FLAG (1 = RAINFALL)
C IWNDDR WIND DIRECTION (0 - 15; 0=N, 1=NNE, ETC)
C HUMRAT HUMIDITY RATIO (LB H2O/LB AIR)
C DENSTY DENSITY OF AIR (LB/CU FT)
C ENTHAL SPECIFIC ENTHALPY (BTU/LB)
C SOLRAD TOTAL HOR. SOLAR (BTU/HR-AREA)
C DIRSOL DIR. NORMAL SOLAR (BTU/HR-AREA)
C ICLDTY CLOUD TYPE (0 - 2)
C WNDSPD WIND SPEED KNOTS
C
C ///上面一段是变量的说明,看来还是不能懂的
REWIND 12
READ (12,9001) IWSZ,IFTYP
C ///读入INPUT.DAT文件头内容,注意变量说明中的IWSZ=1则是60位,2则是30位;IFTYP=1表示老格式,2则....自己看
9001 FORMAT(12X,I1,17X,I1)
C ///格式话对应的内存空间,具体的不记得了
REWIND 11
READ (11,9002) (IWDID(I),I=1,5),IWYR,WLAT,WLONG,IWTZN,IWSOL
9002 FORMAT(5A4,I5,2F8.2,2I5)
IWSOL = IWSZ + (IFTYP-1)*2 - 1
READ (11,9003) (CLN(I),I=1,12)
READ (11,9004) (GT(I),I=1,12)
9003 FORMAT(12F6.2)
9004 FORMAT(12F6.1)
DO 1000 IM=1,12
C ///循环体开始,到标号为1000的语句结束
IDE = MDAYS(IM)
DO 1000 ID=1,IDE
C ///循环体开始,
IRECXO = IM*2 + (ID-1)/16 - 1
IDXO = MOD(ID-1,16) + 1
DO 500 IH=1,24
C ///循环体开始,
READ (11,9005) KMON, KDAY, KH, WBT, DBT, PATM, CLDAMT, ISNOW,
1 IRAIN, IWNDDR, HUMRAT, DENSTY, ENTHAL, SOLRAD,
2 DIRSOL, ICLDTY, WNDSPD
C ///读取数据到变量,上面一条语句转写成了3行的意思
9005 FORMAT(3I2,2F5.0,F6.1,F5.0,2I3,I4,F7.4,F6.3,F6.1,2F7.1,I3,F5.0)
ISOL = INT(SOLRAD + .5)
IDN = INT(DIRSOL + .5)
IWET = INT(WBT+99.5)
IDRY = INT(DBT+99.5)
IPRES = INT(PATM*10.-149.5)
ICLDAM = INT(CLDAMT)
IWNDSP = INT(WNDSPD+0.5)
IHUMRT = INT(HUMRAT*10000.+0.5)
IDENS = INT(DENSTY*1000.-19.5)
IENTH = INT(ENTHAL*2.0+60.5)
IP1 = (IDXO-1)*96 + IH*4 - 3
IDAT(IP1) = IPRES*65536 + IWET*256 + IDRY
IDAT(IP1+1) = ISOL*1048576 + IDN*1024 +
1 ICLDAM*64 + ISNOW*32 + IRAIN*16 + IWNDDR
C /// 这儿转行了
IDAT(IP1+2) = IHUMRT*128 + IDENS
IDAT(IP1+3) = IENTH*2048 + ICLDTY*128 + IWNDSP
500 CONTINUE
C ///循环体结束
IF ((ID .NE. 16) .AND. (ID .NE. IDE)) GO TO 1000
C /// .NE.是不等于的意思,
WRITE (10) IWDID,IWYR,WLAT,WLONG,IWTZN,IRECXO,IDE,CLN(IM),
1 GT(IM),IWSOL,IDAT
C /// 这儿转行了,WRITE输出数据,看样子,他们只是简单的数据拼接,找本书看看WRITE的用法,解释文件应当不难
1000 CONTINUE
C ///循环体结束
END
chendjin 2005-09-15
  • 打赏
  • 举报
回复
现在我的项目工期紧,没有多少时间来调试你的程序,但我可以给你个思路:
1、上述fortran代码已能读取资料到变量KMON, KDAY, KH, WBT, DBT, PATM, CLDAMT, ISNOW...中
你只需添加另写入数据的几行代码而已(存成B文件),如:
OPEN(UNIT=13,FILE='NewWEATHER.FMT')
WRITE (130) IWDID,IWYR,WLAT,WLONG,IWTZN,IRECXO,IDE,CLN(IM),GT(IM),IWSOL,IDAT
130 FORMAT(12F6.2)
2、如何操作啦?将fortran源代码分成A,C文件存放,然后写一批处理文件Fortran.Bat,命令含有:
Copy命令 将A+B+C 合成D文件(何处分裂视你需要来定);
fortran命令 编译D文件(如f77 d.for);
fortran命令 连接编译文件(命令忘了 );
执行命令 D.exe
3、vb中等待D.exe执行完成后调用所需数据,ok。
不知道讲清楚没有,你试试看。

wupeihao 2005-09-14
  • 打赏
  • 举报
回复
fortran我不熟悉。
而且如果全部用VB来做,代码管理可能更容易一些。
谢谢。
chendjin 2005-09-07
  • 打赏
  • 举报
回复
wupeihao:
既然上面代码可以读出数据,你再利用fortran写一段转存数据代码供vb调用,转存时不用二进制写入不就结啦!(换个思路做很快的)。
wupeihao 2005-08-28
  • 打赏
  • 举报
回复
再顶,越顶希望越小
chendjin 2005-08-25
  • 打赏
  • 举报
回复
但这些数据是从另一个文件中读进来的,
=======================================
与读入无关!因为数据转存后格式有可能发生改变,所以必须得到写入语句采用的存放格式才能用其他语言读取!没有写入语句很难处理。
wupeihao 2005-08-25
  • 打赏
  • 举报
回复
顶一下
wupeihao 2005-08-25
  • 打赏
  • 举报
回复
谢谢chendjin(走出Code...) (
我把整个fortran程序贴出来,您帮我看看。
INPUT.TMP for FMTWTH
----+----1----+----2----+----3----+----4----+----5----+----6----+----7
WORD SIZE = 2 FILE TYPE = 2
WORD SIZE = 1 MEANS 60-BIT, 2 MEANS 30-BIT
FILE TYPE = 1 MEANS OLD, 2 MEANS NORMAL (NO SOLAR DATA),
3 MEANS THE DATA HAS SOLAR DATA
FMTWTH Program Listing
PROGRAM FMTWTH
C
C THIS PROGRAM READS A FORMATTED WEATHER FILE (WEATHER.FMT)
C AND A FORMATTED INPUT FILE (FMTWTH.INP) AND WRITES A
C PACKED BINARY DOE2 WEATHER FILE (WEATHER.BIN)
C
DIMENSION CLN(12),GT(12),MDAYS(12),IDAT(1536),IWDID(5)
C
DATA MDAYS / 31,28,31,30,31,30,31,31,30,31,30,31 /
C
OPEN(UNIT=12,FILE='INPUT.DAT')
OPEN(UNIT=11,FILE='WEATHER.FMT')
OPEN(UNIT=10,FILE='WEATHER.BIN',FORM='UNFORMATTED')
C
C IWSZ WORD SIZE 1 = 60-BIT, 2 = 30-BIT
C IFTYP FILE TYPE 1 = OLD, 2 = NORMAL (NO SOLAR),
C 3 = THE DATA HAS SOLAR
C IWDID LOCATION I.D.
C IWYR YEAR
C WLAT LATITUDE
C WLONG LONGITUDE
C IWTZN TIME ZONE NUMBER
C IWSOL SOLAR FLAG FUNCTION OF IWSZ + IFTYP
C CLN CLEARNESS NO.
DOE-2.1E Documentation Update: Weather Processor
Revised April, 1999 VIII.8
C GT GROUND TEMP. (DEG R)
C KMON MONTH (1-12)
C KDAY DAY OF MONTH
C KH HOUR OF DAY
C WBT WET-BULB TEMP (DEG F)
C DBT DRY-BULB TEMP (DEG F)
C PATM PRESSURE (INCHES OF HG)
C CLDAMT CLOUD AMOUNT (0 - 10)
C ISNOW SNOW FLAG (1 = SNOWFALL)
C IRAIN RAIN FLAG (1 = RAINFALL)
C IWNDDR WIND DIRECTION (0 - 15; 0=N, 1=NNE, ETC)
C HUMRAT HUMIDITY RATIO (LB H2O/LB AIR)
C DENSTY DENSITY OF AIR (LB/CU FT)
C ENTHAL SPECIFIC ENTHALPY (BTU/LB)
C SOLRAD TOTAL HOR. SOLAR (BTU/HR-AREA)
C DIRSOL DIR. NORMAL SOLAR (BTU/HR-AREA)
C ICLDTY CLOUD TYPE (0 - 2)
C WNDSPD WIND SPEED KNOTS
C
REWIND 12
READ (12,9001) IWSZ,IFTYP
9001 FORMAT(12X,I1,17X,I1)
REWIND 11
READ (11,9002) (IWDID(I),I=1,5),IWYR,WLAT,WLONG,IWTZN,IWSOL
9002 FORMAT(5A4,I5,2F8.2,2I5)
IWSOL = IWSZ + (IFTYP-1)*2 - 1
READ (11,9003) (CLN(I),I=1,12)
READ (11,9004) (GT(I),I=1,12)
9003 FORMAT(12F6.2)
9004 FORMAT(12F6.1)
DO 1000 IM=1,12
IDE = MDAYS(IM)
DO 1000 ID=1,IDE
IRECXO = IM*2 + (ID-1)/16 - 1
IDXO = MOD(ID-1,16) + 1
DO 500 IH=1,24
READ (11,9005) KMON, KDAY, KH, WBT, DBT, PATM, CLDAMT, ISNOW,
1 IRAIN, IWNDDR, HUMRAT, DENSTY, ENTHAL, SOLRAD,
2 DIRSOL, ICLDTY, WNDSPD
9005 FORMAT(3I2,2F5.0,F6.1,F5.0,2I3,I4,F7.4,F6.3,F6.1,2F7.1,I3,F5.0)
ISOL = INT(SOLRAD + .5)
IDN = INT(DIRSOL + .5)
IWET = INT(WBT+99.5)
IDRY = INT(DBT+99.5)
IPRES = INT(PATM*10.-149.5)
ICLDAM = INT(CLDAMT)
IWNDSP = INT(WNDSPD+0.5)
IHUMRT = INT(HUMRAT*10000.+0.5)
IDENS = INT(DENSTY*1000.-19.5)
IENTH = INT(ENTHAL*2.0+60.5)
IP1 = (IDXO-1)*96 + IH*4 - 3
IDAT(IP1) = IPRES*65536 + IWET*256 + IDRY
IDAT(IP1+1) = ISOL*1048576 + IDN*1024 +
1 ICLDAM*64 + ISNOW*32 + IRAIN*16 + IWNDDR
IDAT(IP1+2) = IHUMRT*128 + IDENS
IDAT(IP1+3) = IENTH*2048 + ICLDTY*128 + IWNDSP
500 CONTINUE
IF ((ID .NE. 16) .AND. (ID .NE. IDE)) GO TO 1000
WRITE (10) IWDID,IWYR,WLAT,WLONG,IWTZN,IRECXO,IDE,CLN(IM),
1 GT(IM),IWSOL,IDAT
1000 CONTINUE
END
wupeihao 2005-08-24
  • 打赏
  • 举报
回复
最后一次顶的机会
wupeihao 2005-08-24
  • 打赏
  • 举报
回复
因为我们现在没再学Fortran,软件用VB写。但需读出以前Fortran写的文件。
这是没办法改变的现实。请尽量帮忙。
写入的时候确实是没有用format的。但这些数据是从另一个文件中读进来的,读的代码如下:
READ (11,9005) KMON, KDAY, KH, WBT, DBT, PATM, CLDAMT, ISNOW,
1 IRAIN, IWNDDR, HUMRAT, DENSTY, ENTHAL, SOLRAD,
2 DIRSOL, ICLDTY, WNDSPD
9005 FORMAT(3I2,2F5.0,F6.1,F5.0,2I3,I4,F7.4,F6.3,F6.1,2F7.1,I3,F5.0)
chendjin 2005-08-24
  • 打赏
  • 举报
回复
难道非要vb来读吗?直接用Fortran读不是很好吗?
你的:写入文件的语句是
WRITE (10) IWDID,IWYR,WLAT,WLONG,IWTZN,IRECXO,IDE,CLN(IM),GT(IM),IWSOL,IDAT
=>10 FORMAT(?????)
cumtbwxj 2005-08-24
  • 打赏
  • 举报
回复
up

学过Fortran 但是5年前了,早忘了。
wupeihao 2005-08-23
  • 打赏
  • 举报
回复
再顶。
wupeihao 2005-08-23
  • 打赏
  • 举报
回复
努力顶,期待高手
province_ 2005-08-23
  • 打赏
  • 举报
回复
如果FORTRAN是按BYTE来写入的那随便读,如果是以某个结构写的,就要用VB仿照做个结构来读才有意义。
wupeihao 2005-08-23
  • 打赏
  • 举报
回复
现在要读出Fortran写的文件。
wupeihao 2005-08-23
  • 打赏
  • 举报
回复
现在要读出Fortran写的文件。
加载更多回复(3)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧