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个字节存放小数部分。,各位大哥有什么好方案吗?谢谢了。

解决方案 »

  1.   

    real数据类型本身是8字节大小,如果你硬是采用4字节保存,那肯定要牺牲精度,甚至造成数据被意外截断,
    除非你要保存的数据精度在4字节范围内
      

  2.   

    如果你一定要保存成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;
      

  3.   

    哦,我说的不够精确,real太大,那用 Single吧,4字节刚好。我的数不大。
    我现在的问题主要是不知道怎么把它存放到文件中,并读取出来。。不能直接这样啊
    sFileStream.WriteBuffer(score,4);/////////,是不是需要自定义存储结构,比如说第1,2,3个字节存放整数部分,第4个字节存放小数部分。谢谢收看
      

  4.   


    你直接 sFileStream.WriteBuffer(save, SizeOf(save))/////////
    的话,取出来ReadBuffer的时候,怎么还原成 single值?
      

  5.   

    因为 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;
      

  6.   

    这种存 取的方式保存浮点数,前提是你的a.mm文件是二进制文件,如果你的a.mm是文本文件,那么保存之后将无法在记事本之类的文本查看器中正确显示。
    流的方式读写,你用什么方式写入的,据用什么方式读取,他会忠实记录你写入的信息。
      

  7.   

    哦,直接 sFileStream.Read(load, SizeOf(load));
    就能取出来了,我还以为需要做什么转化呢。我先试试看
      

  8.   

     sFileStream.Write(score, sizeof(score));