自己定义的记录类型:
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!!!
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!!!
解决方案 »
- 咨询一个OLE灾难性故障的问题
- 我用ADO连接一个1万条记录的Excel文件 效率太慢!!!!!
- 在线请教高手!delphi中如何解决TShortcutBar.AddImageList(const ImageList: IDispatch);的使用
- ImageList图标变黑块
- 读取MEMO里面每行内容出问题了,循环不下去,高手看下
- BDE连接的PARODOX数据库,如何获得某个表的头100条记录?
- 请问如何使 OpenDialog 只返回 文件名 !!!!!!!!!! 急呀!!
- 急问:如何在MDI中把DLL当作子窗口调用?
- 怎么使得 MDIChild 窗口占满 MDIMain 的整个客户区而又不是最大化?
- 在线等 ,,,怎样获得汉字的编旁
- Insert into b (id,name) values(pno,pname)运行错误
- 怎样在一个窗体最小化时 设置该窗体的borderstyle为bsSizeable?( 假设现在的窗体状态为bsnone或其它)
怎么说不关闭则会造成数据丢失,不懂!
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;
你的方法可以把student.dat文件完整写入temp.dat文件,但是文件的内容看得一清二础,我需要用流的方式写入文件就是打开文件时看不出里面的内容,
是乱码,请问没有其他方法呢可以解决?
又看了一下这个贴子,实际是看看给没给分,偷偷的说,呵呵。
你的要求也没什么难实现的啊,只是不明白你为什么一定要这么做,实际上你直接吧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;
给分吧,很穷的说。
所以要用到Tstringlist;该怎么办,高手们?
Tstudent=record
id:string[20];
name:string[20];
age:integer;
end;
就是用stream.write(TStudent)
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;