自己定义的记录类型:
type
  Tstudent=record
          id:string;
          name:string;
          age:integer;
          end;
利用Tmemorystream写入文件,文件的类型.dat:改操作成功
procedure TForm1.Button1Click(Sender: TObject);
VAR 
Target:Tmemorystream;
 student:Tstudent;
begin
 with student do
 begin
 id:='100001';
 name:='李小强';
 age:=20;
 end;
 try
 target:=tmemorystream.create;
 target.Write(student,sizeof(student));
 target.savetofile('c:\student.dat');
 finally
 target.free;
 end;
end;
利用Tstringlist保存到另一个.dat文件:
procedure TForm1.Button2Click(Sender: TObject);
var
fstream:Tfilestream;
sl:Tstringlist;
begin
fstream:=Tfilestream.Create('c:\student.dat',fmopenread);
fstream.Position:=0;
sl:=Tstringlist.Create;
sl.LoadFromStream(fstream);
sl.SavetoFile('c:\temp.dat');
fstream.free;
sl.free;
end;
当打开temp.dat文件时,只是保存了原文件的一些,不能完全保存:当遇到student.dat
文件的不可见字符后面的内容就没有保存,请问高手是什么原因?怎么解决?Thanks!!!

解决方案 »

  1.   

    用sl.SavetoFile('c:\temp.dat')语句进行保存,都还没有打开文件的语句,
    怎么说不关闭则会造成数据丢失,不懂!
      

  2.   

    TStudent= packed record
        id: string[10];
        name: string[20];
        age: integer;
      end;procedure TForm1.Button2Click(Sender: TObject);
    var
      RF: file of TStudent;
      SL: TStringlist;
      S: TStudent;
      procedure WriteStrLst(AStrlst: TStringlist; AStudent: TStudent);
      begin
        AStrlst.Add(AStudent.id);
        AStrlst.Add(AStudent.name);
        AStrlst.Add(IntToStr(AStudent.age));
      end;
    begin
      SL := TStringlist.Create;
      AssignFile(RF, 'c:\student.dat');
      try
        Reset(RF);
        while not Eof(RF) do
        begin
          Read(RF,s);
          WriteStrLst(sl, s);
        end;
        SL.SavetoFile('c:\temp.dat');
      finally
        Closefile(RF);
        SL.free;
      end;
    end;
      

  3.   

    DunDao:
    你的方法可以把student.dat文件完整写入temp.dat文件,但是文件的内容看得一清二础,我需要用流的方式写入文件就是打开文件时看不出里面的内容,
    是乱码,请问没有其他方法呢可以解决?
      

  4.   

    不要用string活着dynamic array作你的record成员变量。那样只能写一个指针到文件。用静态数组
      

  5.   

    To pengd(pengd):
      又看了一下这个贴子,实际是看看给没给分,偷偷的说,呵呵。
      你的要求也没什么难实现的啊,只是不明白你为什么一定要这么做,实际上你直接吧Student.dat复制成Temp.dat不就一切OK了?当然也可以这样:
    var
      FS: TFileStream;
      MS: TMemoryStream;
    begin
      FS := TFileStream.Create('C:\Student.dat', fmOpenRead);
      MS := TMemoryStream.Create;
      FS.Position := 0;
      try
        MS.LoadFromStream(FS);
        MS.SaveToFile('C:\temp.dat');
      finally
        MS.Free;
        FS.Free;
      end;
    end; 
      给分吧,很穷的说。
      

  6.   

    但是我是用邮件的正文发送文件的内容,然而正文body的类型为Tstringlist;
    所以要用到Tstringlist;该怎么办,高手们?
      

  7.   

    这样定义呢?type
      Tstudent=record
              id:string[20];
              name:string[20];
              age:integer;
              end;
      

  8.   

    能不能用一个TStudent记录从流中读出文件的内容,在弄到StringList中?
    就是用stream.write(TStudent)
      

  9.   

    sorry,一着急写错了,能不能用Stream.Read(AStudent, SizeOf(AStudent))读出来。
      

  10.   

    楼主,你要看不见数据,下面可以的,看看吧,各位大侠多指点:声明
    type
    Tstudent=record
       id:string;
       name:string;
       age:integer;
       end;
    TST=^Tstudent;程序代码:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
       M,M1:TMemoryStream;
       ST1,ST2:TST;
       iss:integer;
    begin
       Ini:=TIniFile.Create('C:\student.ini');   //也可改为.dat
       M:=TMemoryStream.Create;
       M1:=TMemoryStream.Create;
       New(ST1);
       New(ST2);
       try
          with ST1^ do
          begin
             id:='100001';
             name:='李小强';
             age:=20;
          end;
          iss:=Sizeof(ST1^);                    //
          M.WriteBuffer(ST1^,iss);              //
          M.Position:=0;                        // 写入16进制数据
          Ini.WriteBinaryStream('st','info',M); //      Ini.ReadBinaryStream('st','info',M1); //
          M1.Position:=0;                       //
          CopyMemory(ST2,M1.Memory,iss);        //  读出
          ShowMessage(ST2^.id);                 //
          ShowMessage(ST2^.name);               //
          ShowMessage(IntToStr(ST2.age));       //
       finally
          Ini.Free;
          M.Free;
          M1.Free;
          FreeMemory(M);
          FreeMemory(M1);
       end;
    end;
      

  11.   

    靠,这么笨,都学死了,懒的再说了。郁闷ing...........