2013-08-06 41 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