2009-07-31 94 views
1

縮寫形式:是否可以從指針創建流?德爾福中的增量指針/從指針創建流

我有一個指向我需要閱讀的文件數據的指針。我使用WriteBuffer()將指針中的數據傳輸到一個TFileStream,它可以工作。但是現在我想以塊的形式閱讀它來顯示進度條。所以我需要一步一步閱讀它。

我不得不選擇:

1)增量指針淺黃色,並使用WriteBuffer()如常。 (WriteBuffer總是從頭開始讀取,因此我需要增加指針)

2)從指針創建一個流。這可能嗎?

代碼:

var InputStream : TMemoryStream; 
    Buff: Pointer; 


    Header: TOCHeader; 
begin 

// Here I get the pointer 
Size := GetOverlay(Buff); 

// Transfer data to memory stream 
InputStream.WriteBuffer(Buff^, SizeOf(Header)); 

InputStream.Seek(0, soFromBeginning); 

// Read the header 
InputStream.ReadBuffer(Header, SizeOf(Header)); 

// Increment the pointer. Doesn't work :-(. Message Ordinal type required 
Inc(Buff, SizeOf(TOC)); 
+0

您的兩個代碼的InputStream變量。你們都從中讀取並寫入。你能澄清嗎? – mghie 2009-07-31 10:00:13

+0

哦,對不起。我修正了這個問題。我只是複製了重要的變量和代碼短語,而InputStream定義似乎非常重要;-)。 – Simon 2009-07-31 10:20:46

+0

請注意,您需要在寫入和讀取它之間重置流的位置。您當前的代碼會引發異常。 – mghie 2009-07-31 10:33:45

回答

1

當我看到你的問題時,我的腦海裏浮現出一個問題。你有一個指向filedata的指針(來自我假設的磁盤),並且你正在使用該指針的數據填充文件流(儘管在你的問題中你正在填充內存流)。爲什麼不使用TFileStream打開正在閱讀的文件?

var 
    FileStream: TFileStream; 
    Header: TOCHeader; 
begin 
    FileStream := TFileStream.Create('c:\fileIWantToRead.txt', fmOpenRead); 
    FileStream.ReadBuffer(Header, SizeOf(Header)); 
    <...> 
end; 

如果你想增加你的指針,則首先將其轉換爲一個類型的指針,因此編譯器知道如何增加你的指針。

Inc(PByte(Buff), SizeOf(TOC)); //sizeof returns size in bytes, so cast pointer to a bytepointer 
2

你可以創建自己的TCustomMemoryStream後代,這在構造函數調用SetPointer(),使用從GetOverlay()接收地址和大小。有關更多信息,請參閱有關TCustomMemoryStream的Delphi文檔。

編輯:

那麼,這無關你的問題,但在評論你寫的,你只希望通過流從運行的可執行文件中讀取。這是很容易做到:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Str: TStream; 
begin 
    Str := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone); 
    try 
    Caption := Format('Size of executable: %u bytes', [Str.Size]); 
    // start to read the contents of the file ... 

    finally 
    Str.Free; 
    end; 
end; 

我會離開原來的答案,萬一有人真的想創建一個從指針(只讀)流的內存塊。