我把函数贴上来了,请帮我看看是哪儿处理不对啊。 如何以缓存的方式读取呢? 目前只能读取几K的文件,稍大一点的就读取失败。//读取文件函数 function ReadFile1(FileName:String):boolean; var sFileName: string; f: TfileStream; ED_Data: array[0..2048] of char; lRet: integer; lOffset: Longint; lOrigin: Word; i,count:integer; begin sFileName:=form1.opendialog1.FileName; f := TfileStream.Create(sFileName,fmOpenRead); try f.Seek(lOffset,lOrigin); //文件定位,从lOrigin开始移动lOffset begin lRet := f.Read(f,count); //lRet为实际读到的字节数,ED_Data为读到的内容 form1.Memo2.Lines.LoadFromStream(f); j:=f.size div 1024; //计算文件一共有多少个包 // form1.suimemo1.Text:=strtohexstr(ed_data[count]); Application.ProcessMessages; begin for i:=0 to j do begin form1.Label1.Caption:='正在读取第 '+inttostr(i)+' 包 '; form1.Memo1.Text:=form1.Memo1.Text+ midstr(strtohex(form1.Memo2.text),2048*i,2048)+' '; //Progressbar进度栏 form1.ProgressBar1.Max :=j; form1.ProgressBar1.Min:=0; form1.ProgressBar1.Position := i; Application.ProcessMessages; end; // form1.memo2.clear; showmessage('成功读取'+inttostr(i)+'个包'); Application.ProcessMessages; end; end; finally FreeAndNil(f); Application.ProcessMessages; end; end;
扩展名是.bin?那是没有关系的,主要看内部存储方式
BlockRead 还有楼上说的2进制和16进制的文件区别是什么?不明白
用BLOCKREAD 怎么读取到MEMO上啊 ?
可以帮我看看我的函数哪儿出问题了吗? //读取文件函数function ReadFile0(FileName:String):boolean; var F:File; Src:Array[0..1024-1] of Char; i,j,numread:Integer; begin result:=True; if not FileExists(FileName) then begin result:=false; exit; end; AssignFile(F,FileName); Reset(F,1); if filesize(F) < sizeof(Src) then begin //Test CloseFile(f); showmessage('文件大小错误'); exit; end; { //while not Eof(F) do while numread<>0 do BlockRead(F,Src,sizeof(Src),numread); form1.Memo1.text:=Src[numread]; Application.ProcessMessages; } repeat BlockRead(F,Src,sizeof(Src),numread); FOR i:=0 to numread do begin form1.Memo1.lines.GetText[i]:=Src[i]; Application.ProcessMessages; end; until (NumRead = 0) ; CloseFile(F); Application.ProcessMessages; end;
你的文件使用的字符编码?? 如果是二进制文件其中数据不是字符编码,不是人可以看懂的写在memo上也没有意义啊 如果不是 var F:File; Buf:array[0..255] of Char;
Begin AssignFile(F,TempFileName); Reset(F,1); if IoResult=0 then begin repeat BlockRead(F, Buf, 256, BytesRead); if BytesRead>0 then Memo.Lines.Add(StrPas(Addr(Buf)); until BytesRead=0; CloseFile(F); end; end;
如何以缓存的方式读取呢?
目前只能读取几K的文件,稍大一点的就读取失败。//读取文件函数
function ReadFile1(FileName:String):boolean;
var
sFileName: string;
f: TfileStream;
ED_Data: array[0..2048] of char;
lRet: integer;
lOffset: Longint;
lOrigin: Word;
i,count:integer;
begin
sFileName:=form1.opendialog1.FileName;
f := TfileStream.Create(sFileName,fmOpenRead);
try
f.Seek(lOffset,lOrigin); //文件定位,从lOrigin开始移动lOffset
begin
lRet := f.Read(f,count); //lRet为实际读到的字节数,ED_Data为读到的内容
form1.Memo2.Lines.LoadFromStream(f);
j:=f.size div 1024; //计算文件一共有多少个包
// form1.suimemo1.Text:=strtohexstr(ed_data[count]);
Application.ProcessMessages;
begin
for i:=0 to j do
begin
form1.Label1.Caption:='正在读取第 '+inttostr(i)+' 包 ';
form1.Memo1.Text:=form1.Memo1.Text+ midstr(strtohex(form1.Memo2.text),2048*i,2048)+' ';
//Progressbar进度栏
form1.ProgressBar1.Max :=j;
form1.ProgressBar1.Min:=0;
form1.ProgressBar1.Position := i;
Application.ProcessMessages;
end; // form1.memo2.clear;
showmessage('成功读取'+inttostr(i)+'个包');
Application.ProcessMessages;
end;
end; finally
FreeAndNil(f);
Application.ProcessMessages;
end;
end;
还有楼上说的2进制和16进制的文件区别是什么?不明白
用BLOCKREAD 怎么读取到MEMO上啊 ?
可以帮我看看我的函数哪儿出问题了吗?
//读取文件函数function ReadFile0(FileName:String):boolean;
var
F:File;
Src:Array[0..1024-1] of Char;
i,j,numread:Integer;
begin
result:=True;
if not FileExists(FileName) then
begin
result:=false;
exit;
end;
AssignFile(F,FileName);
Reset(F,1); if filesize(F) < sizeof(Src) then
begin //Test
CloseFile(f);
showmessage('文件大小错误');
exit;
end;
{ //while not Eof(F) do
while numread<>0 do BlockRead(F,Src,sizeof(Src),numread);
form1.Memo1.text:=Src[numread];
Application.ProcessMessages;
}
repeat
BlockRead(F,Src,sizeof(Src),numread);
FOR i:=0 to numread do
begin
form1.Memo1.lines.GetText[i]:=Src[i];
Application.ProcessMessages;
end;
until (NumRead = 0) ;
CloseFile(F);
Application.ProcessMessages;
end;
如果是二进制文件其中数据不是字符编码,不是人可以看懂的写在memo上也没有意义啊
如果不是
var
F:File;
Buf:array[0..255] of Char;
Begin
AssignFile(F,TempFileName);
Reset(F,1);
if IoResult=0 then begin
repeat
BlockRead(F, Buf, 256, BytesRead);
if BytesRead>0 then
Memo.Lines.Add(StrPas(Addr(Buf));
until BytesRead=0;
CloseFile(F);
end;
end;
YKTD26,用了你提供这个函数读取大文件还是不对啊,10几K的文件就没有问题。这是怎么回事啊?
*************************************************************************************
读取小文件取到MEMO的字符串为以下:馃?馃?馃?馃?馃 犪馃?馃錖? @ L X h ? ? _-锧> ?燒?_-?> ?燒?郚?_-?> ?燒?郚?_-?> ?燒钀€忊 樿 €?佮 傕0冟癅?繠? P?
p 拌 T狷
?@? ?P? ?P?P陪`V?p?p??婎? R醸 p犮0 茶 ?@? ?@?@你PU?p??婒晷? ? ? (? 崂€?? 崂?
饫 Q泺馉 ??馉徇?? 豚B熷P犮 P腻谺熷 @斿 袛?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾?????????????€-?p-?`-?P-?@-?0-? -?-? - @?@-錒B熷 P斿 袇遘 ?B熷<R熷 `斟 `腻(B熷 b熷 `栧 `勫 袞?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?漓
?酀?饾淞 胄A熷蠶熷 `斟 `腻糀熷碼熷 `栧 `勫 袞?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾?0-? -?-?犪袓? N 0O徇?? -???????????€-?p-?`-?P-?@-?@戜P戜`戜`-?P-?@-? -?0-?熷 绣佲 厘 Q? 郂熷 P斿 袇逡?汔 熷酄?/徇?爿 ?@濅?? 濅濅?
濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾? -?犪袓? N 0O徇?? -轲_-閜 辫p -? -? -門 熷 绣佲 厘 Q? 0@熷 P斿 袇逖?? 熷酄?/徇?惚 ? 借??呓鑮€?€?€r€s€p€P 堸 馉?馉?馉?馉?馉?馉?@- 罓 犪 犪 纮弭@熷郂? 犪 @庡鐯熷郂? 犪 @庡蹳熷郂? 犾
***********************************************************************************
读取大文件时取到的字符串:馃?馃?馃?馃?馃?
PU?p??婒陘+
<B熷<R熷
??????€-?p-?`-?P-?@-?@戜P戜`戜`-?P-?@-?
?0犮, 熷
0€借0@-閐犮?熷?隌犮?熷?霚7熷燱熷
馉?
佱
饋借?熷
ye€P`€|(
?
犮
?
嗿?
`犪P犪
4@勨??
?牮A-?
熷
熷
p@-?
p犪
D`熷
熷
?
鳣-?
竊尼
<X熷
误?
悟隯
??
??
犍?
鼇借 嶁犪T
??@-?
??
`犪p犪@呭p犪皅裴
`腻酄?馉?
?
勦?熷掔?
勦?熷
??
盃?
#
傕戝
勦
臓?滥?P皱
嶟?
酄?馉?
i
?贶)
??
犮
犪
犮
?
犪
w
犮 Q?
勨蔰
€?
?熷?葆
?旰0籴缆熷袄茚脆葆繪?
7
P犪
犪 犪犪!L€徼?濆€?濆€?@€?
?嗅?箩?熷0B喟佬釥銦?缹嗖0提饾?@-閐犮?熷奯
dP?
皜裴?8@-?
??`
?
??
8@-?
0団 犪
@斿??
用richtext替代试试