如何用文件流(或者内存流)读取2进制文件,反过来再以文本文件储存在磁盘上? ( 积分: 100 )

  • 主题发起人 主题发起人 witkey
  • 开始时间 开始时间
W

witkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个文本文件aa.txt,读出到内存流里面。然后,再存到另外的文本文件里bb.txt,并且显示在Memo中。如下就能实现。
========================================
var
FS:TFileStream;
MS:TMemoryStream;
begin
FS:=TFileStream.Create('F:/aa.txt',fmOpenRead);
MS:=TMemoryStream.Create;
MS.LoadFromStream(FS);
MS.SaveToFile('F:/bb.txt');
memo1.Lines.LoadFromStream(MS);
FS.Free;
MS.Free;
FS:=nil;
MS:=nil;
end;
======================================
现在,我又有一个2进制无格式文件(扩展名是.20);我想把它读出来,再以文本文件的形式存储到另外的文本文件中,怎样实现?
 
你的意思是不是要把二进制文件中的内空读出来
然后把 每个字节转成十六进制串,然后存入文件啊
用一个循环就可以完成了
 
to Mike1234567890
差不多就是这个意思,其实,2进制文件里的数据都是浮点型的10进制的。只要读出,显示在Memo或者其他什么中都可以,能看得出来原来的数据格式就行,说白了吧,我还要进行数据计算。
 
2进制文件的格式要知道才读的出吧
 
你先用记事本把这个文件打开看看,如果是文本类型的就没问题,如果都是乱码,你打开也没有用。
 
to nicai_wgl
是2进制的文件,这个文件是用Fortran语言导出的数据,交给我的时候人家说是2进制无格式文件。
 
我想把它读出来,再以文本文件的形式存储到另外的文本文件中,怎样实现?

var
i: Integer;
tmpByte: Byte;
tmpFileStream: TFileStream;
tmpStrings: TStrings;
begin
tmpStrings := TStringList.Create;
tmpFileStream := TFileStream.Create('c:/aa.dat', fmOpenRead);
try
tmpFileStream.Position := 0;
for i := 1 to tmpFileStream.Size do
begin
tmpByte := 0;
tmpFileStream.Read(tmpByte, Sizeof(Byte));
tmpStrings.Append(IntToHex(tmpByte, 2) + ', ');
end;
tmpStrings.SaveToFile('c:/aa.txt');
finally
tmpStrings.Free;
tmpFileStream.Free;
end;
end;
 
TO nicai_wgl
谢谢!
我先试试,然后给你加分。
 
我试过了,可以产生一个AA.TXT文件;我用TMemo看到了,好像是16进制整型的数据(但是,我不敢确定),是字母和数字的混合字符串。

1、这个要转换的2进制文件,原来是浮点数据计算之后的结果(比如是温度,而且是浮点型的);
2、只是在计算完成之后,用2进制的形式存到磁盘上了,是用FORTRAN计算的;
3、现在,我要把它恢复到浮点型的数据。也就是浮点数据由2进制存盘,再从2进制提取成浮点型的数据,怎样做?
 
LZ,你能大体猜测有哪些数据和这些数据的规律吗?
可以这样做:
建一个结构体
Type
TData = Record
A: Single;
B: Single;
End;
建流:Stream,读文件Stream.LoadFromFile(File);然后读入到结构体:
Stream.Read(Data,Size(TData));然后看看数据是否是你期望的,假如里面数据很有规律的话,我想还是比较容易猜中的。
 
如果不知道数据的结构,要从二进制文件解析出原始数据是比较困难的,最好能找出原来数据保存的格式。
 
to nicai_wgl
您好!首先谢谢您的热心解答,我想问一下给您提供如下线索,能否解析出二进制文件中的数据。
我这里只有一些数据文件资料和Fortran 读取的数据文件的程序。是下面的样子的。
Fortran程序中显示的数据存储是,每个文件有:
10个变量;共有31天的数据;每天73*144个数据
即:
10*31*144*73 个数据。
顺序是:

1天:
变量1
73*144 个数据
变量2
73*144 个数据
......
变量10
73*144 个数据
-------------
2天
变量1
73*144 个数据
变量2
73*144 个数据
......
变量10
73*144 个数据
-------------
......
......
......
31天
变量1
73*144 个数据
变量2
73*144 个数据
......
变量10
73*144 个数据
================
您看能不能帮助我解析出来,给我一个初步的思路也行。
谢谢!
 
如果里面全是浮点数
那你得分析一下
数据之间是怎么分隔的
然后再编程
 
TP时代这根本就不是问题,Delphi把人弄懒了。
这是个典型的有格式二进制文件,用标准的Delphi文件操作函数就可以操作。
 
我现在试着用Fortran95编程读取。因为,那个原始的数据毕竟是Fortran编的,现在基本上学会了Fortran的一些基本语句,可以打开读取数据文件中的数据了!下一步,看看转换一下数据格式,把2进制的数据文件转换成能可以见到的数据格式文件,用.txt格式就可以。只要能看到里面的数据格式;我就可以用Delphi编程了,重新操作数据。呵呵呵...
也是一个捷径!还学会了另外一种语言。
 
关键是解析 [每天73*144个数据],
73 * (36 * 4)? 还是 73 * (18 * 8)?,数据中间是否有间隔?
Fortran里的浮点占几个字节?这些都知道的话,你可以定义个数据结构
DayData = packet record
Value1: array[0..72, 0..17] of Double;
...
Value10:
end;

tmpDayData: DayData;
tmpFileStream.Read(tmpDayData, SizeOf(tmpDayData)); <<-- 得到数据
 
to nicai_wgl
谢谢你!我知道了。
我这几天在学习Fortran的基本语法,我要把那个Fortran写的代码段弄明白;然后,才可以知道数据文件里的数据格式,这样,我还得用D来处理后期的计算结果。
我的想法是2进制数据文件,在不知道数据格式的时候是否可以读出来,也就是说:可不可以把这个文件的字节长度读出来然后,每遇到(每个数据用控格或者“,”号区分)控格(或者“,”)就赋值给一个数组变量,最后在储存到另外的一个文本文件中;这样不就可以看出2进制文件里的格式了吗!
可以吗?知道的说说?(行或者不行)
 
呵呵,witkey你的想法当然能实现,而且不用编程序,
你可以装个UltraEdit直接查看二进制数据文件,
但问题是二进制文件不一定有很清楚的格式让你看的,
你看过就知道了。
 
浮点数,可能还要做一次浮点数解析,早期Fortran曾使用过16,24位数据,与Delphi不兼容,用Delphi解析,不如直接用Fortran编程,但是因版本差别太大,可能不认(不识别),
 
to nicai_wgl
能告诉我在那里下载UltraEdit吗?
谢谢!
to 常见2006
我已经学会了Fortran的最基本的那几条语句。
可以编写一般性质的2进制数据文件的读写。
谢谢你!
 
后退
顶部