研究一下结构化文件的知识吧。
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
解决方案 »
- 利用多线程获取某些关键词的google搜索量的问题
- 十万火急!求:把sqlserver里的word用olecontainer读取到delphi里
- 哪里有完整的DELPHI5 下载
- 怎么实现Com+中服务器自动通知客户端(急)
- 谁能告诉我,远程数据模块上添加方法时在哪里设置参数?
- 我最近编写一个DLL,用来实现ftp功能,使用了delphi中的nmftp控件,结束调用后总出现莫名其妙的内存错误。请高手指教!
- 我想用delphi写个isapi程序
- 人之将去,其分也散2。阿刚和北京男人近来取分
- 请问是否可以通过调用API之类的方法注册Service?
- 关于动态设置TDBChart组件的几个问题!
- 在stringgrid中显示一个字段数据出现的错误?
- 小问题:Tdump.exe 是用来做什么的?
2: FileName: File of 结构名
buffer: array[] of 结构名
用 Read() 读 注意: 是Read() 而不是 ReadLn() 或BlockRead()
Write() 写
TPACK_DATA = class
app_name: string;
exe_data: TMemoryStream;
end;
var
pd:TPACK_DATA;
MS: TMemoryStream;
f:integer;
begin
pd := TPACK_DATA.Create;
pd.app_name := 'test'; MS := TMemoryStream.Create();
MS.LoadFromFile('c:\kkk.exe'); //kkk.exe 大小为 700K
pd.exe_data:=Tmemorystream.Create;
pd.exe_data.loadfromstream(ms);
f:=filecreate('c:\test.pak');
filewrite(f,pd,sizeof(pd));
fileclose(f);
pd.Free;
//为什么写出的'c:\test.pak' 总是1K ??? 奇怪
请详细一点好吗?
pd.exe_data:=Tmemorystream.Create;
//加一名句(IE又出错了,打字都错)
ms.Position := 0; pd.exe_data.loadfromstream(ms);
f:=filecreate('c:\test.pak');
filewrite(f,pd,sizeof(pd));
fileclose(f);
pd.Free;
var
P: Pointer;
Buffer: Pointer;
begin
with TFileStream.Create('FileName', fmOpenRead or fmShareDenyNone) do
try
GetMem(Buffer, Size);
try
P := Buffer; //Buffer为首地址,保存, P为引用Buffer指针
//处理文件流P
finally
FreeMem(Buffer);
end;
finally
Free;
end;
end;在这里Buffer里面二进制内存,也可以是字符集。。
关键是你用什么来指针来指向它。如
P: PChar; P := Buffer;
//字符
S := StrPas(P);
ShowMessage(S);var
P: PByte; P := Buffer;
I := P^;
//Byte类型
ShowMessage(IntToStr(I));如此类推,PDWORD, FPInteger, 之类的转成各种类型了。
:)
变成这样试试
AssignFile(f,'c:\test.pak');
Rewrite(f);
Write(f,pd,sizeof(pd));
fileclose(f);
pd.Free;
var
pd:TPACK_DATA;
MS: TMemoryStream;
f:TFileStream;
begin
pd := TPACK_DATA.Create;
pd.app_name := 'test'; MS := TMemoryStream.Create();
MS.LoadFromFile('h:\AA.txt'); //kkk.exe 大小为 700K
MS.Position := 0;
pd.exe_data:=Tmemorystream.Create;
pd.exe_data.loadfromstream(ms);
f := TFileStream.Create('H:\test.txt',fmCreate);// f :=filecreate('H:\test.txt');
0A ShowMessage(IntToStr(MS.Size));
MS.Position := 0;
f.CopyFrom(pd.exe_data,pd.exe_data.Size);
FreeAndNil(f);
pd.Free;
end;
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
这里SizeOf(pd) = SizeOf(Object) + SizeOf(String)
4 + 4
Object = 4, string = 4;
你没有为它们分配空间,所以字节数为8,你看一下文件应该是8字节的内容吧
TPACK_DATA = class
app_name: string;
exe_data: TMemoryStream;
end;FileWrite(F, pd.app_name[1], Length(pd.App_name));
FileWrite(F, pd.Exe_data.Memory^, pd.Exe_Data.Size);这样应该没问题了吧。
其它你的程序应该这样写:
var
P: Pointer;
SourceFileName: string;
SourceStream, DestStream: TFileStream;
begin
SourceFileName := 'SourceFileName';
SourceStream := TFileStream.Create(SourceFileName, fmOpenRead);
DestStream := TFileStream.Create('DestFileName', fmCreate);
try
DestStream.WriteBuffer(SourceFileName[1], Length(SourceFileName));
DestStream.WriteBuffer(SourceStream.Memory^, SourceStream.Size);
finally
SourceStream.Free;
DestStream.Free;
end;
end;这样简单吧。
String 类型: 如果没有为它分配空间,那么它是指针类型,Default:'',sizeof() = 4;可以用Length()取得它的长度
像用VC一般 char msg[100]都是分配空间的,Delphi也如此,var S: string[100];它的首地址是S[1](即是说它也可以当指针用)