2013-08-06 24 views
0

使用Visual C++我試圖從流中讀取圖像,我通過將流存儲在緩衝區中來執行此操作。我知道在緩衝區的什麼位置我有圖像(它是流中的第一個文件,我知道圖像的大小,所以我讀取並將圖像存儲在緩衝區中,直到文件的大小和這些文件的大小都正確。我確信關於它)第一次當我讀圖像時沒有問題,它可以正常工作。代碼如下 -讀取動態創建的緩衝區的內容給第二次調用的內存的錯誤地址

ReadFromStream(IStream *pStream) 
{//this pStream stream contents the file contents 
     ULONG cbRead; 
     int size=5348928; 
     char *buffer = new char[size + 1]; 
     HRESULT hr = pStream->Read(buffer, size, &cbRead); //here we store the stream in buffer.Now all the data is in buffer. 
     buffer[cbRead ] = L'\0'; 
     int location = 512 ; 
     char FileContents[107643]; 
     memcpy(FileContents,&buffer[location],SizeOfFile); // here i have the contents of the image in File contents.I am sure about it its location. For the first call to ReadFromStream() function it works fine. 
      } 

但我的情況是,我必須第二次讀取圖像也在程序的相同執行。所以當我第二次調用ReadFromStream()函數時發生了什麼(使用與調試流值相同的流的值是相同的。)即使緩衝區顯示的內容遠離存儲在圖像中的位置它(我的意思是流有圖像文件作爲第一個文件,但在第二次調用ReadFromStream()緩衝區指向另一個文件的數據,但第一個文件實際上是圖像文件)。所以這個內存是如何分配給這個意外的文件的?

爲什麼緩衝區顯示的數據位置離開始索引很遠(對於第二次調用ReadFromStream()也應該顯示圖像文件作爲起始文件爲什麼它顯示的文件很遠從圖像文件???)因爲我猜一些內存分配,哪些必須刪除?但我在哪裏以及如何不知道..我對嗎?

可能是因爲在第二次調用ReadFromStream();這個緩衝區已經分配了一些內存,我的意思是第二次調用緩衝區指向的地址不是從零開始(但它應該這樣做,因爲我認爲)

+0

不,你沒有正確理解我的問題。請再讀一遍。這個「位置」與我的問題無關。我的問題是當我第二個瓷磚我調用ReadFromStream(具有相同的流值);那麼緩衝區應該提供圖像(這是第一個文件),但是它將遠離圖像文件給一些文件。 – Sss

+0

@Jrol是否可以刪除由int size = 5348928分配的內存; ???可能是因爲在第二次調用ReadFromStream();這個緩衝區已經分配了一些內存,我的意思是第二次調用緩衝區指向的地址不是從零開始。 – Sss

+1

如果我正確理解你,你已經做出了一個非常瘋狂的假設。一旦你刪除[]緩衝區,它就會消失,連同它所包含的數據。你絕對不能指望下一次調用'new'會給你相同的緩衝區和數據。 – jrok

回答

2

流就像普通文件一樣,它們是順序的在自然界中,一旦您讀取了數據,「讀取光標」就會被提前,另一次調用Read()將讀取更多數據,依此類推。

爲了反向重新讀取相同的數據,請使用IStream::Seek()。例如,要返回到流的開始:

LARGE_INTEGER li = { 0 }; 
HRESULT hr = pStream->Seek(li, STREAM_SEEK_SET, NULL); 

並非所有的流支持查找,所以你應該檢查返回代碼錯誤。

+0

的評論@謝謝Joanathan Thts解決方案.. – Sss