Fortran Coder
标题: 从文本文件读取数据,写成特定的二进制文本格式 [打印本页]
作者: duzilinhan 时间: 2016-4-14 16:03
标题: 从文本文件读取数据,写成特定的二进制文本格式
问题: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或者其他数字,实在不懂。求指教。
TXTtoDAT.FOR
(1.6 KB, 下载次数: 2)
1.txt
(3.12 KB, 下载次数: 3)
作者: 楚香饭 时间: 2016-4-14 21:33
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
作者: duzilinhan 时间: 2016-4-14 21:52
谢谢你的回答,还没有运行,我将去学习你的代码和相关知识
作者: duzilinhan 时间: 2016-4-15 23:16
Read( 16 , pos = 32+lngTDT*4+1 )
Inquire( 12 , Pos = i )
这种语句要在哪种版本才能使用?
作者: 楚香饭 时间: 2016-4-16 07:13
除了 Compaq Visual Fortran,除了 Powerstation,除了 g77 ,除了 NPD Fortran ,除了这些已经死了的编译器
但凡还在更新维护中的编译器,都可以使用。
作者: duzilinhan 时间: 2016-4-18 22:37
谢谢回答,非常感谢!!!!
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) |
Powered by Discuz! X3.2 |