TFileStream.Read不正确是怎么回事?(50分)

  • 主题发起人 主题发起人 siaosa
  • 开始时间 开始时间
S

siaosa

Unregistered / Unconfirmed
GUEST, unregistred user!
将一字符串用filestream.write方法写入一文件
用filestream.read方法从文件读入一字符串中,结果不对,这是怎么回事?
//将一字符串存入文件
procedure TForm1.Button1Click(Sender: TObject);
var
a:TFileStream;
Str:String;
begin
Str:='abcdefghijklmnopqrstuvwxyz';
a:=TFileStream.Create('001',fmCreate);
a.Write(Str,Length(Str));
a.Free;
end;

//将一文件里的内容读入字符串 [red]这个过程结果不对[/red]
procedure TForm1.Button2Click(Sender: TObject);
var
a:TFileStream;
Str,tmp:String;
i:Integer;
begin
a:=TFileStream.Create('001',fmOpenRead);
a.Position:=0;
while true do
begin
a.Read(tmp[1],100); //考虑到可能会读入大文件,进行分段读取,一次读取10个字符
Str:=Str+tmp; //保存进Str
if a.Position>=a.Size then break; //如果到文件结尾了,则退出
end;
a.Free;
end;
 
To 楼主:
1、你到底是一次读入 10 个字符还是 100 个字符?说话不要前后矛盾...
2、tmp 是字符串类型,默认初始化为 nil,而你根本没给它分配空间,你还用 a.Read(tmp[1],100) 往里面读数据,能读进去么?
3、另外你这个程序还有一个致命缺陷,假设你的文件只有 101 个字符,那第一轮读取会得到前 100 个字符,当第二轮读取时,由于只剩下 1 字符,所以第二次只把第一个字符读到 tmp[1],但是 tmp 中上次剩下的 99 个字符由于没有清空,仍会一起加到 str 中,所以最后 str 会得到 200 个字符而不是 101 个。
4、这么改:
var
a: TFileStream;
str, tmp: string;
i: Integer;
begin
a := TFileStream.Create('001', fmOpenRead);
a.Position := 0;
SetLength(tmp, 100);
while a.Position < a.Size do
begin
i := a.Read(tmp[1], 100);
str := str + Copy(tmp, 1, i);
end;
a.Free;
end;
 
读出来的结果不对,读出的结果是乱码按理应该是26个字母
 
procedure TForm1.Button1Click(Sender: TObject);
var
a:TFileStream;
Str:String;
begin
Str:='abcdefghijklmnopqrstuvwxyz';
a:=TFileStream.Create('001.txt',fmCreate);
a.Write(Str[1],Length(Str));
a.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a:TFileStream;
Str:String;
tmp: array [0..255] of char;
begin
a:=TFileStream.Create('001.txt',fmOpenRead);
a.Position:=0;
str:='';
while true do
begin
tmp:='';
a.Read(tmp[0],10); //考虑到可能会读入大文件,进行分段读取,一次读取10个或者100个字符
Str:=Str+tmp; //保存进Str
if a.Position>=a.Size then break; //如果到文件结尾了,则退出
end;
a.Free;
Memo1.Clear;
memo1.Lines.Add(str);
end;
 
To:kaida
读取的结果不对,应该是26个字母,结果Str里只有EC这两个字母
 
To siaosa:
1、您是说我写的不对还是你自己写的不对?
2、我自己测试了一下,我的程序没问题。另外建议您最好看看你自己的宝贝“001”,是你自己写进去一堆乱码,不要把错误推到别人身上!
3、一个不留神,发现你的写入过程也是错误百出,乱码就是它造成的,帮你改了一下:
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
a: TFileStream;
begin
str := 'abcdefghijklmnopqrstuvwxyz';
a := TFileStream.Create('001', fmCreate);
a.Write(str[1], Length(str));
a.Free;
end;
注:str 本身是个指针,它的内容才是字符串的首地址。
 
vvyang的方法是对的,是我搞错了,没注意 写入的方法也有问题。谢谢 kaida,vvyang
 
刚才一不留神分全给kaida了,vvyang 你到这里来拿分吧,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3879445
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
794
import
I
后退
顶部