duzilinhan 发表于 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或者其他数字,实在不懂。求指教。



楚香饭 发表于 2016-4-14 21:33:24

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

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

duzilinhan 发表于 2016-4-14 21:52:15

楚香饭 发表于 2016-4-14 21:33
1. 这里没有学计算机专业的。
2. 你的数据文件格式还是比较简单的。
3. 对于二进制文件来说,有一种很方便 ...

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

duzilinhan 发表于 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 )
这种语句要在哪种版本才能使用?

楚香饭 发表于 2016-4-16 07:13:04

除了 Compaq Visual Fortran,除了 Powerstation,除了 g77 ,除了 NPD Fortran ,除了这些已经死了的编译器

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

duzilinhan 发表于 2016-4-18 22:37:52

楚香饭 发表于 2016-4-16 07:13
除了 Compaq Visual Fortran,除了 Powerstation,除了 g77 ,除了 NPD Fortran ,除了这些已经死了的编译 ...

谢谢回答,非常感谢!!!!
页: [1]
查看完整版本: 从文本文件读取数据,写成特定的二进制文本格式