Fortran Coder

查看: 8040|回复: 5
打印 上一主题 下一主题

[文件读写] 从文本文件读取数据,写成特定的二进制文本格式

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
13 点
跳转到指定楼层
楼主
发表于 2016-4-14 16:03:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
问题:Fortran语言,从文本文件读取数据,写成二进制文本格式。需要写的二进制文件格式是有要求的,个人怎么写都不对,因为二进制文件存在保存格式问题,所以想求教怎么写出和需要的格式一模一样。非计算机专业,还请认真指教。
要求:输入文本文件1.txt,读取其中的1024行数据,转成二进制文件1.dat保存,需要输出的格式为与6.dat文件相同,否则无法用特定软件打开。
说明:
6.dat打开如下图所示
第一行32字节是软件读取的格式确认信息,时间信息等,因此输出的1.dat第一行32字节应该复制这行信息。
从第二行开始就是保存的1024个数据,应该是每4字节一个数据,一直到00001000h 行。而1.dat文件的1024个数据信息是从文本文件1.txt读取出来的,然后写入二进制文件1.dat中。
剩下的也是一些其他信息,最好也相应的复制到1.dat文件中。

目前我能够从1.txt读取文件,但是不知道怎么写。因为尝试多次,写数据时会出问题。
TXTtoDAT.for是前人写的从ASC转成DAT的文件,但是我尝试着改了,但是写出来第一行虽然一样了但是1024个数据部分不连续,写一行空3行,格式有问题。改RECL大小,则每次写完一次RECL大小的记录后,会突然有0200 0000或者其他数字,实在不懂。求指教。
6.dat (4.53 KB, 下载次数: 2)
TXTtoDAT.FOR (1.6 KB, 下载次数: 2)
1.txt (3.12 KB, 下载次数: 3)


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
608 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2016-4-14 21:33:24 | 只看该作者
1. 这里没有学计算机专业的。
2. 你的数据文件格式还是比较简单的。
3. 对于二进制文件来说,有一种很方便的东西,叫 stream,本站有介绍文章
4. 我写了一个简单的代码,也做了注释,应该比较易懂。

[Fortran] 纯文本查看 复制代码
Program www_fcode_cn    
  use ,  Intrinsic :: ISO_C_Binding
  Implicit None
  character(len=1)        :: yn     !//问询
  character(len=30)       :: myHead !//头部
  integer(kind=C_SHORT)   :: lngTDT !//数据大小
  Integer(kind=C_Int) , allocatable :: spcin(:) !//数据
  Character(len=1)    , allocatable :: tail(:)  !//尾部
  integer :: n !//大小
  Open( 16 , File = '6.dat'  , access="stream" , form="unformatted" )
  Open( 12 , File = 'ca.chn' , access="stream" , form="unformatted" )
  Open( 11 , File = '1.txt' )
  Inquire( 16 , size = n )    !//查询文件大小
  Read( 16 ) myHead , lngTDT  !//读前头部32字节
  n = n - 32 - lngTDT*4       !//算出尾部大小  
  If ( n > 0 ) then           !//如果有尾部  
    Allocate( tail(n) )       !//分配尾部  
    Read( 16 , pos = 32+lngTDT*4+1 ) tail !//读取尾部
  End If
  Write(*,*)'1024 CH ?(Y/N)'
  Read(*,*) yn
  If( YN == 'Y' .OR. YN == 'y' ) then
    LngTDT=1024
  Else
    LngTDT=4096
  EndIf
  Allocate( spcin(LngTDT) )   !//分配数据
  Write( 12 ) myHead , LngTDT !//写入头部32字节
  read(11,*)                  !//跳过第一行<<DATA>>
  read(11,*) spcin            !//读取数据
  write( 12 ) spcin           !//写入数据
  If(n>0) write(12) tail      !//写入尾部
  Deallocate( spcin )
  If(n>0) Deallocate( tail )
  close( 16 )
  close( 12 )
  close( 11 )
End Program www_fcode_cn

4

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
13 点
板凳
 楼主| 发表于 2016-4-14 21:52:15 | 只看该作者
楚香饭 发表于 2016-4-14 21:33
1. 这里没有学计算机专业的。
2. 你的数据文件格式还是比较简单的。
3. 对于二进制文件来说,有一种很方便 ...

谢谢你的回答,还没有运行,我将去学习你的代码和相关知识

4

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
13 点
地板
 楼主| 发表于 2016-4-15 23:16:26 | 只看该作者
楚香饭 发表于 2016-4-14 21:33
1. 这里没有学计算机专业的。
2. 你的数据文件格式还是比较简单的。
3. 对于二进制文件来说,有一种很方便 ...

Read( 16 , pos = 32+lngTDT*4+1 )
Inquire( 12 , Pos = i )
这种语句要在哪种版本才能使用?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
608 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

5#
发表于 2016-4-16 07:13:04 | 只看该作者
除了 Compaq Visual Fortran,除了 Powerstation,除了 g77 ,除了 NPD Fortran ,除了这些已经死了的编译器

但凡还在更新维护中的编译器,都可以使用。

4

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
13 点
6#
 楼主| 发表于 2016-4-18 22:37:52 | 只看该作者
楚香饭 发表于 2016-4-16 07:13
除了 Compaq Visual Fortran,除了 Powerstation,除了 g77 ,除了 NPD Fortran ,除了这些已经死了的编译 ...

谢谢回答,非常感谢!!!!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-19 21:38

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表