2011-06-10 79 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