写了一个简单的读写流的类,功能是
读出流的某个部分和写入流的某个部分
type
TBufmanager = class(TInterfacedObject, IBufferManager)
private
streamtosend:TStream;
recvstream:TMemoryStream;
public
procedure init(stream: TStream; PackCout: integer);
procedure writeBuf(packnum: integer; Buf: Pointer; size: integer);
procedure readBuf(packnum: integer; var Buf: Pointer; var size: integer);
procedure recvFinished(savefilename:string);
end;
const FRAME_SIZE=10
implementation
uses main;
{ TBufManager }
procedure TBufmanager.init(stream: TStream; PackCout: integer);
begin
if (streamtosend=nil) and (stream<>nil) then
begin
streamtosend:=stream;
end;
if recvstream=nil then
recvstream:=TMemoryStream.Create;
end;procedure TBufmanager.readBuf(packnum: integer; var Buf: Pointer;
var size: integer);
var
actualsize:integer;
begin
streamtosend.Position:=packnum*FRAME_SIZE;
size:=streamtosend.Read(Buf,size);
end;procedure TBufmanager.recvFinished(savefilename:string);
begin
if recvstream<>nil then
begin
DeleteFile(savefilename);
recvstream.SaveToFile(savefilename);
end;
end;procedure TBufmanager.writeBuf(packnum: integer; Buf: Pointer;
size: integer);
begin
recvstream.Position:=packnum*FRAME_SIZE;
recvstream.Write(Buf,size);
end;
end.建一个文件“bb.txt”,内容为“0123456789ABCDEFGHIJ”;共20个字符。
对上面这个类写了一个过程来测试。
var
bufmanager:TBufmanager;
stream:TFileStream;
p1:Pointer;
i:integer;
begin
stream:=TFileStream.Create('bb.txt',fmOpenRead or fmShareDenyWrite) ;
bufmanager:=TBufmanager.Create;
bufmanager.init(stream,6);
i:=FRAME_SIZE;
bufmanager.readBuf(1,p1,i);
bufmanager.writeBuf(0,p1,i);
bufmanager.recvFinished('recv.txt');
end;
结果recv.txt的内容的是前四个字符是“ABCD”,但是后六个字符全都是乱码。
请各位大大指教。
解决方案 »
- quickreport报表,QRLabel换行问题
- 今天心情好
- delphi多语言实现的问题
- 瘦客户端怎么是怎么回事情?
- websnap 中关于网页权限和显示问题请教!!
- 求一段按字符数量文本分行的代码
- 怎样将report格式的listview中的文字拷贝到剪贴板中?
- 如何利用SHFileOperation函数实现直接删除,不放入回收站!!!
- Playsound如何从一段音乐的中间开始播放?播放一段音乐中如何暂停?
- 1K价格诚招DELPHI编写考试系统,管理员请勿删除
- 走过路过的进来看看qreport问题.
- 100分的难题:fastreport报表如何实现针式打印机、连续走纸(纸张两边带小孔)、的套打?
2, size:=streamtosend.Read(Buf,size);只是把数据写到了指针地址里,没写入指针的指向的空间,改成 size:=streamtosend.Read(Buf^,size);
3,recvstream.Write(Buf,size);也一样的错误,改成recvstream.Write(Buf^,size);