2011-06-10 60 views
1

你好,我需要非常大的二进制文件的工作,所以我不能使用的功能,诸如分派(),Closefile()等,我想用TFileStream的其阅读()/Write()方法。但是我有问题,因为我无法读回我写到流中的内容。我已经了解到问题与编码有关,所以我认为我需要使用Unicode而不是Ansi。但我还没有明白如何去做。有人可以用例子帮助我吗?我知道如何写入/读取/读取文件,但这并不能帮助我解决问题。问题文件二进制/写

+1

'TFileStream'原始数据(字节),而不是字符串,所以你的'Ansi'与'Unicode'问题是没有意味着明显或通常。你应该在你的问题中包含一些代码。 – 2011-06-10 18:09:55

+0

用'fmOpenReadWrite'或'fmCreate'打开'TFileStream',你可以阅读也可以书写。你也需要寻求。既然你没有给出任何代码,那么很难说更多。 – 2011-06-10 19:11:32

回答

0

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

+1

-1。显然你错过了Q的第一句话:“我不能使用函数作为Assign,Closefile等”。另外,您错过了Q的标题:“... ** tfilestream **”。 – 2011-06-10 18:13:50

3

如果你同时控制书写和阅读,你可以使用读者和作家。例如:

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

    finally 
    reader.Free; 
    end; 
end; 

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

如果不控制好写的一部分。你希望有一种方法来知道文件格式。 (至少是字符串和它们的大小)。所以,你可以准备一个缓冲区中读取字符。

-1

如果你想写/自/至流中读取字符串,最简单的方式是投你的字符串作为ShortString短这始终是255字符长(但意味着你的字符串不能超过255个字符)。如果您只需要在流中读取/写入字符串,请改为使用TStringList。

否则,你有其他更复杂的选项:

  • 写入/读取的TStringList到流(那么你必须实现一种文件格式)
  • 写入字符串,并检索它读取字符通过字符和积累字符,直到遇到空字符,重复每个字符串的操作
+1

-1用于暗示'ShortString':与它相关的太多限制可以用来解决这个问题。用于提示'TStringList'。因为'TStringList'具有'SaveToStream'和'LoadFromStream'方法,更不用说'SaveToFile'和'LoadFromFile'了,所以'TStringList'为'文件类型'。 -1用于暗示读取和写入按char逐字符流。 – 2011-06-10 18:46:42

+0

关于文件格式:您可以将StringList保存到TMemoryStream,然后将MemoryStream.Memory写入主流。我使用了很多:在主文件中,你写流的大小,然后是stream.memory,这是为了无限数量的流。解释文件格式很简单:阅读即将到来的'streamsize',将下一个'streamsize'字节转换为某些东西,等等......关于ShortString:答案中提到了这种方法的局限性。 – az01 2011-06-10 19:12:28

+2

我不明白你为什么要在两者之间使用内存流。为什么不直接将字符串列表保存到文件流? – jpfollenius 2011-06-10 22:17:21