Delphi 读取非文本文件(二进制)

3

在Delphi中,我如何以非文本模式打开二进制文件?就像C函数fopen(filename,“rb”)一样。

2个回答

15

有几个选项。

1. 使用文件流

var
  Stream: TFileStream;
  Value: Integer;
....
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
  Stream.ReadBuffer(Value, SizeOf(Value));//read a 4 byte integer
finally
  Stream.Free;
end;

2. 使用读取器

您可以结合使用 TBinaryReader 来简化值的读取:

var
  Stream: TFileStream;
  Reader: TBinaryReader;
  Value: Integer;
....
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
  Reader := TBinaryReader.Create(Stream);
  try
    Value := Reader.ReadInteger;
  finally
    Reader.Free;
  end;
finally
  Stream.Free;
end;

读取器类有许多函数可以读取其他数据类型。而您可以通过二进制写入器朝相反的方向前进。

3. 旧式帕斯卡I / O

您可以声明一个File类型的变量,并使用AssignFileBlockRead等从文件中读取。我真的不建议采用这种方法。现代代码和库几乎都偏爱流模式,如果自己做同样的事情,您将使代码更容易适配其他库。


现在我明白了区别所在。类型为File和TextFile的变量不同。谢谢大家。 - bLAZ
1
不要忘记 FileOpen()FileRead()FileClose() 函数,它们是 TFileStream 内部使用的。 - Remy Lebeau
TFileCreate.Create? - drakorg
@eduado 谢谢,是个小笔误。你可以随时编辑的。 - David Heffernan

3

您有不同的选项,其中两个是:

使用老派方法,比如您指出的C函数:

var
  F: File;
begin
  AssignFile(F, 'c:\some\path\to\file');
  ReSet(F);
  try
    //work with the file
  finally
    CloseFile(F);
  end
end;

使用更现代的方法创建基于文件的TFileStream:

var
  F: TFileStream;
begin
  F := TFileStream.Create('c:\some\path\to\file', fmOpenRead);
  try
    //work with the file
  finally
    F.Free;
  end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接