【问题标题】:Problem file binary in read/write with tfilestream使用 tfilestream 读/写问题文件二进制文件
【发布时间】:2011-06-10 18:01:29
【问题描述】:

您好,我需要处理非常大的二进制文件,所以我不能使用诸如 Assign()、Closefile() 等函数。我想将 TFileStream 用于它的 Read()/Write() 方法。但是我有问题,因为我无法读回我写到流中的内容。我知道问题与编码有关,所以我认为我需要使用 Unicode 而不是 Ansi。但我不明白该怎么做。有人可以帮助我,举个例子吗?我知道如何写入/读取文件,但这并不能帮助我解决问题。

【问题讨论】:

  • TFileStream 适用于原始数据(字节),而不是字符串,因此您的 AnsiUnicode 问题绝不是明显或常见的。您应该在问题中包含一些代码。
  • fmOpenReadWritefmCreate打开你的TFileStream,你可以读写。你也需要寻求。由于您没有提供任何代码,因此很难说更多。

标签: delphi delphi-xe


【解决方案1】:

如果你控制写作和阅读,你可以使用阅读器和作家。例如:

var
  reader : TReader;
begin
  reader := TReader.Create(MyStream, BufferSize);
  try
    myString : = reader.ReadString;

  finally
    reader.Free;
  end;
end;

TReader 有办法区分 unicode 和 ansistring,只要它们是由 TWriter 编写的。

如果您不控制写入部分。希望您有办法了解文件格式。 (至少是字符串及其大小)。所以你可以准备一个缓冲区来读取字符。

【讨论】:

    【解决方案2】:

    对不起,我的回答错了,就像安德烈亚斯说的那样。也许这篇文章会对你有所帮助? Writing a string to a TFileStream in Delphi 2010

    【讨论】:

    • -1。显然您错过了 Q 的第一句话:“我不能将函数用作分配、关闭文件等”。另外,您错过了 Q 的标题:“... tfilestream ”。
    【解决方案3】:

    如果您想从/向流写入/读取字符串,简单的方法是将字符串转换为始终为 255 个字符长的 Shortstring(但这意味着您的字符串不能超过 255 个字符)。如果您只需要在流中读取/写入字符串,请改用 TStringList。

    否则你还有其他更复杂的选择:

    • 将 TStringList 写入/读取到流中(然后您必须实现一种文件格式)
    • 写入字符串并检索它逐个字符读取并累积字符直到遇到空字符,对每个字符串重复该操作

    【讨论】:

    • -1 建议ShortString:与它相关的限制太多,无法用作解决此问题的方法。 +1 建议TStringList。 -1 表示带有TStringList 的“文件格式类型”,因为TStringListSaveToStreamLoadFromStream 方法,更不用说SaveToFileLoadFromFile。 -1 用于建议按字符读取和写入流。
    • 关于文件格式:您可以将StringList保存到TMemoryStream,然后将MemoryStream.Memory写入主流。我经常使用这个:在主文件中你写流大小然后是stream.memory,这用于无限数量的流。解释文件格式很容易:读取即将到来的'streamsize',将下一个'streamsize'字节转换为某种东西等等......关于ShortString:答案中提到了这种方法的局限性。
    • 我不明白你为什么要在两者之间使用内存流。为什么不直接将字符串列表保存到文件流中呢?
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2018-07-26
    • 2016-06-14
    • 2021-06-03
    • 1970-01-01
    • 2013-07-10
    • 2020-09-09
    相关资源
    最近更新 更多