怎样把一个浮点数存放到文件中?

allen12345 2009-10-10 04:02:30
score:real;
sFileStream: TFileStream;

我想建立一个文件
sFileStream:= TFileStream.Create('a.mm',fmCreate or fmShareExclusive);
sFileStream.Position:=0;
score:= 3000.98;
sFileStream.WriteBuffer();/////////

怎样把score的值写入 a.mm中??注意,只能写4个字节,也就是 a.mm文件中固定地开辟出 4字节的空间来存放 score的值。。是不是要自己定义一些格式?比如说第1,2,3个字节存放整数部分,第4个字节存放小数部分。,各位大哥有什么好方案吗?谢谢了。

...全文
245 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahjoe 2009-10-11
  • 打赏
  • 举报
回复
sFileStream.Write(score, sizeof(score));
allen12345 2009-10-10
  • 打赏
  • 举报
回复
哦,直接 sFileStream.Read(load, SizeOf(load));
就能取出来了,我还以为需要做什么转化呢。我先试试看
wxieyang 2009-10-10
  • 打赏
  • 举报
回复
这种存 取的方式保存浮点数,前提是你的a.mm文件是二进制文件,如果你的a.mm是文本文件,那么保存之后将无法在记事本之类的文本查看器中正确显示。
流的方式读写,你用什么方式写入的,据用什么方式读取,他会忠实记录你写入的信息。
emo66 2009-10-10
  • 打赏
  • 举报
回复
OK
wxieyang 2009-10-10
  • 打赏
  • 举报
回复
因为 Single 本身是4字节的浮点数,如果你的数不是很大,建议使用Single保存数据,读写操作的例子如下

procedure TForm1.Button1Click(Sender: TObject);
var
score:real;
save, load: Single;
sFileStream: TFileStream;
begin
sFileStream:= TFileStream.Create('a.mm',fmCreate or fmShareExclusive);
try
sFileStream.Position := 0;
score:= 3000.98;
save := score;
sFileStream.WriteBuffer(save, SizeOf(save)); //向流中写入
sFileStream.Position := 0; //读之前要先定位,找到要读的数据的开始部分
sFileStream.Read(load, SizeOf(load));
Caption := FloatTostr(RoundTo(load, -2)); //四舍五入取两位小数
finally
sFileStream.Free;
end;
end;
allen12345 2009-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wxieyang 的回复:]
如果你一定要保存成4字节,你可以先将real转换为 Single 然后在保存
Delphi(Pascal) codevar
score:real;
save: Single;
sFileStream: TFileStream;begin
sFileStream:= TFileStream.Create('a.mm',fmCreateor fmShareExclusive);
sFileStream.Position:=0;
score:=3000.98;
save := score;
sFileStream.WriteBuffer(save, SizeOf(save))/////////end;
[/Quote]

你直接 sFileStream.WriteBuffer(save, SizeOf(save))/////////
的话,取出来ReadBuffer的时候,怎么还原成 single值?
allen12345 2009-10-10
  • 打赏
  • 举报
回复
哦,我说的不够精确,real太大,那用 Single吧,4字节刚好。我的数不大。
我现在的问题主要是不知道怎么把它存放到文件中,并读取出来。。不能直接这样啊
sFileStream.WriteBuffer(score,4);/////////,是不是需要自定义存储结构,比如说第1,2,3个字节存放整数部分,第4个字节存放小数部分。

谢谢收看
lhy 2009-10-10
  • 打赏
  • 举报
回复
乘256,再转成整数。
用的时候转成浮点数,再除以256。
wxieyang 2009-10-10
  • 打赏
  • 举报
回复
如果你一定要保存成4字节,你可以先将real转换为 Single 然后在保存
var
score:real;
save: Single;
sFileStream: TFileStream;
begin
sFileStream:= TFileStream.Create('a.mm',fmCreate or fmShareExclusive);
sFileStream.Position:=0;
score:= 3000.98;
save := score;
sFileStream.WriteBuffer(save, SizeOf(save))/////////
end;
gyk120 2009-10-10
  • 打赏
  • 举报
回复
formatfloat('0.00',Num)
wxieyang 2009-10-10
  • 打赏
  • 举报
回复
real数据类型本身是8字节大小,如果你硬是采用4字节保存,那肯定要牺牲精度,甚至造成数据被意外截断,
除非你要保存的数据精度在4字节范围内
allen12345 2009-10-10
  • 打赏
  • 举报
回复
怎么格式化啊,贴出代码吗
bdmh 2009-10-10
  • 打赏
  • 举报
回复
你把它格式化成4个字节就是了

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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