如何用指针实现把在内存中操作文件内容(100分)

  • 主题发起人 主题发起人 163boy
  • 开始时间 开始时间
1

163boy

Unregistered / Unconfirmed
GUEST, unregistred user!
我想从一个文本文件(比如HTML文件)中取出所有内容,存在一个自己分配的内存区域中,然后用两个指针对其进行字符查找,删除,等操作,请问具体该怎么做,以下读入代码好象不好使。
var
txtfile:Textfile;
tempstr: string;
htmlbuf,htmlbuf2:pchar;
begin
htmlbuf:=allocmem(700000);
htmlbuf2:=htmlbuf;
assignfile(txtfile,'d:/a.htm');
reset(txtfile);
try
while not eof(txtfile) do //以下是读取全部内容入缓冲区
begin
readln(txtfile,tempstr);
for i:=0 to (length(tempstr)-1) do
begin
htmlbuf2^:=tempstr;
htmlbuf2:=htmlbuf2+1;
end;
end;
finally
htmlbuf2^:='0'
//请问如何在所有内容后加一个空标记,用NULL不行
closefile(txtfile);
end;
memo2.text:=string(htmlbuf);//不能显示文件内容
 
所有内容后加一个空标记: htmlbuf2^:= #0
 
htmlbuf2^:=tempstr[i+1]
因为string的第一个字符是 s[1] 而不是 s[0]
 
for i:=1 to length(tempstr) do
begin
htmlbuf2^:=tempstr;
htmlbuf2:=htmlbuf2+1

end;

因为string的第一个字符是 s[1] 而不是 s[0]
 
另外
for i:=1 to length(tempstr) do
begin
htmlbuf2^:=tempstr;
htmlbuf2:=htmlbuf2+1

end;

这个循环完了后还要加 回车换行 #13#10 因为tempstr不会读入换行符号的
 
其实最简单的是:

var
h:HFILE;
s:integer;
buf:array[0..700000] of char
//要那么大吗?

h:=_lopen('d:/a.htm',OF_READ);
if(h=HFILE_ERROR)then
RaiseLastWin32Error();
s:=_lread(h,buf,700000)
//s 是实际读入
buf:=#0;

 
//用TMemoryStream吧,他自动为你分配内存,不管多大

var
MemoryStream:TMemoryStream;
begin
MemoryStream:=TMemoryStream.Create;
try
MemoryStream.LoadFromFile('C:/M.htm');
Memo1.Lines.LoadFromStream(MemoryStream);
finally
MemoryStream.Free;
end;
end;


//用文件内存指针 MyPointer:=PChar(MemoryStream.Memory);
 
访问MyPointer:PChar;

MyPointer[0]为第一字符,
MyPointer[1]为第二字符,
.....

MyPointer为整个字符串
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部