如何打开一个非文本文件并读出文件中某一位置的内容?最好有例子。 用tfilestream修改position即可。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果知道文件格式可用blockread,blockwrite,seek定位。选有用的看吧。procedure TMainForm.btnCopyClick(Sender: TObject);var SrcFile, DestFile: File; BytesRead, BytesWritten, TotalRead: Integer; Buffer: array[1..500] of byte; FSize: Integer;begin AssignFile(SrcFile, 'srcfile.tst'); AssignFile(DestFile, 'destfile.tst'); Reset(SrcFile, 1); try Rewrite(DestFile, 1); try try TotalRead := 0; FSize := FileSize(SrcFile); repeat BlockRead(SrcFile, Buffer, SizeOf(Buffer), BytesRead); if BytesRead > 0 then begin BlockWrite(DestFile, Buffer, BytesRead, BytesWritten); if BytesRead <> BytesWritten then raise Exception.Create('Error copying file') else begin TotalRead := TotalRead + BytesRead; prbCopy.Position := Trunc(TotalRead / Fsize) * 100; prbCopy.Update; end; end until BytesRead = 0; except Erase(DestFile); raise; end; finally CloseFile(DestFile); end; finally CloseFile(SrcFile); end;end;unit persrec;interfaceuses Classes, dialogs, sysutils;type TPersonRec = packed record Name: String[20]; ID: String[8]; Sex: String[1]; BirthDay: TDateTime; Age: Integer; end; TRecordStream = class(TFileStream) private function GetNumRecs: Longint; function GetCurRec: Longint; procedure SetCurRec(RecNo: Longint); protected function GetRecSize: Longint; virtual; public function SeekRec(RecNo: Longint; Origin: Word): Longint; function WriteRec(const Rec): Longint; function AppendRec(const Rec): Longint; function ReadRec(var Rec): Longint; procedure First; procedure Last; procedure NextRec; procedure PreviousRec; property NumRecs: Longint read GetNumRecs; property CurRec: Longint read GetCurRec write SetCurRec; end;implementationfunction TRecordStream.GetRecSize:Longint;begin Result := SizeOf(TPersonRec);end;function TRecordStream.GetNumRecs: Longint;begin Result := Size div GetRecSize;end;function TRecordStream.GetCurRec: Longint;begin Result := (Position div GetRecSize) + 1;end;procedure TRecordStream.SetCurRec(RecNo: Longint);begin if RecNo > 0 then Position := (RecNo - 1) * GetRecSize else Raise Exception.Create('已经到达文件的开始。');end;function TRecordStream.SeekRec(RecNo: Longint; Origin: Word): Longint;begin Result := Seek(RecNo * GetRecSize, Origin);end;function TRecordStream.WriteRec(Const Rec): Longint;begin Result := Write(Rec, GetRecSize);end;function TRecordStream.AppendRec(Const Rec): Longint;begin Seek(0, 2); Result := Write(Rec, GetRecSize);end;function TRecordStream.ReadRec(var Rec): Longint;begin Result := Read(Rec, GetRecSize); Seek(-GetRecSize, 1);end;procedure TRecordStream.First;begin Seek(0, 0);end;procedure TRecordStream.Last;begin Seek(0, 2); Seek(-GetRecSize, 1);end;procedure TRecordStream.NextRec;begin if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then raise Exception.Create('已经到达文件的结尾') else Seek(GetRecSize, 1);end;procedure TRecordStream.PreviousRec;begin if (Position - GetRecSize >= 0) then Seek(-GetRecSize, 1) else Raise Exception.Create('已经到达文件的开始');end;end. 谢谢诸位!我是想Seek后读出当前指针所指的文件位置的值(如:AA或3F) 值可根据数据类型倒着往回算例如type TPersonRec = record Name: String[20]; ID: String[8];end;一个记录共占28. reset(sfile, 1); seek(sfile, 28*5); blockread(sfile,person,sizeof(personrec));就是读第六个记录 我是想Seek后读出当前指针所指的文件位置存储的值例如文件aaa.datx)儘^R*窷(蝻@pr褭勋|讏渄貱,F!n坦$€4,S?录ubx血b2釦9跕PS6貖D雝頺堜?頹?JJ鑍*尰爈毗Vw$Zb?5?)?`B/莒60`i蓄??t?v4迅T尷澁c燔葴篡s2[2H飤?k&ar#8嫸?\K澢?[圹睅鹃袚Z胱 N我想读出他第5个位置的值是^; 第6个位置的值是R 哥们儿,用流吧(tFileStream)。关于他的用法,见DELPHI的帮助 fastreport固定显示同行 关于多页面时IDHTTP的COOKIE处理的问题 哪位有用过TDBGridEh导出功能? 一个数组中存有若干个字母,如何将它们依次取出并将它们拼成一个字符串? 关于POP3服务器接收邮件的问题? 将DBGrid设成在翻页时才进一步取数据而不会一下子把数据全取回来的属性? 关于日期型字段的SQL语句怎么写? 如何通过ado的方式连接oracle和sql server2000数据库 什么样的delphi能进深圳?? 关于在客户机连接服务器数据库的问题 困扰已久的数据库问题 怎样在DBGrid控件里实现排序,谢谢。
procedure TMainForm.btnCopyClick(Sender: TObject);
var
SrcFile, DestFile: File;
BytesRead, BytesWritten, TotalRead: Integer;
Buffer: array[1..500] of byte;
FSize: Integer;
begin
AssignFile(SrcFile, 'srcfile.tst');
AssignFile(DestFile, 'destfile.tst');
Reset(SrcFile, 1);
try
Rewrite(DestFile, 1);
try
try
TotalRead := 0;
FSize := FileSize(SrcFile);
repeat
BlockRead(SrcFile, Buffer, SizeOf(Buffer), BytesRead);
if BytesRead > 0 then
begin
BlockWrite(DestFile, Buffer, BytesRead, BytesWritten);
if BytesRead <> BytesWritten then
raise Exception.Create('Error copying file')
else begin
TotalRead := TotalRead + BytesRead;
prbCopy.Position := Trunc(TotalRead / Fsize) * 100;
prbCopy.Update;
end;
end
until BytesRead = 0;
except
Erase(DestFile);
raise;
end;
finally
CloseFile(DestFile);
end;
finally
CloseFile(SrcFile);
end;
end;
unit persrec;interface
uses Classes, dialogs, sysutils;type TPersonRec = packed record
Name: String[20];
ID: String[8];
Sex: String[1];
BirthDay: TDateTime;
Age: Integer;
end; TRecordStream = class(TFileStream)
private
function GetNumRecs: Longint;
function GetCurRec: Longint;
procedure SetCurRec(RecNo: Longint);
protected
function GetRecSize: Longint; virtual;
public
function SeekRec(RecNo: Longint; Origin: Word): Longint;
function WriteRec(const Rec): Longint;
function AppendRec(const Rec): Longint;
function ReadRec(var Rec): Longint;
procedure First;
procedure Last;
procedure NextRec;
procedure PreviousRec;
property NumRecs: Longint read GetNumRecs;
property CurRec: Longint read GetCurRec write SetCurRec;
end;implementationfunction TRecordStream.GetRecSize:Longint;
begin
Result := SizeOf(TPersonRec);
end;function TRecordStream.GetNumRecs: Longint;
begin
Result := Size div GetRecSize;
end;function TRecordStream.GetCurRec: Longint;
begin
Result := (Position div GetRecSize) + 1;
end;procedure TRecordStream.SetCurRec(RecNo: Longint);
begin
if RecNo > 0 then
Position := (RecNo - 1) * GetRecSize
else
Raise Exception.Create('已经到达文件的开始。');
end;function TRecordStream.SeekRec(RecNo: Longint; Origin: Word): Longint;
begin
Result := Seek(RecNo * GetRecSize, Origin);
end;function TRecordStream.WriteRec(Const Rec): Longint;
begin
Result := Write(Rec, GetRecSize);
end;function TRecordStream.AppendRec(Const Rec): Longint;
begin
Seek(0, 2);
Result := Write(Rec, GetRecSize);
end;function TRecordStream.ReadRec(var Rec): Longint;
begin
Result := Read(Rec, GetRecSize);
Seek(-GetRecSize, 1);
end;procedure TRecordStream.First;
begin
Seek(0, 0);
end;procedure TRecordStream.Last;
begin
Seek(0, 2);
Seek(-GetRecSize, 1);
end;procedure TRecordStream.NextRec;
begin
if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then
raise Exception.Create('已经到达文件的结尾')
else
Seek(GetRecSize, 1);
end;procedure TRecordStream.PreviousRec;
begin
if (Position - GetRecSize >= 0) then
Seek(-GetRecSize, 1)
else
Raise Exception.Create('已经到达文件的开始');
end;end.
我是想Seek后读出当前指针所指的文件位置的值(如:AA或3F)
type TPersonRec = record
Name: String[20];
ID: String[8];
end;
一个记录共占28.
reset(sfile, 1);
seek(sfile, 28*5);
blockread(sfile,person,sizeof(personrec));
就是读第六个记录
x)儘^R*窷(蝻@pr褭勋|讏渄貱,F!n坦$€4,S?录ubx血b2釦9跕PS6貖D雝頺堜?頹?JJ鑍*尰爈毗Vw$Zb?5?)?`B/莒60`i蓄??t?v4迅T尷澁c燔葴篡s2[2H飤?k&ar#8嫸?\K澢?[圹睅鹃袚Z胱 N
我想读出他第5个位置的值是^; 第6个位置的值是R