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(); 这个缓冲区已经分配了一些内存,我的意思是第二次调用缓冲区指向的地址不是从零开始的(但它应该按照我的想法去做)

4

1 回答 1

2

流就像普通文件一样,它们本质上是顺序的,一旦您读取数据,“读取光标”就会前进,另一个调用Read()将读取更多数据,依此类推。

要向后搜索以再次重新读取相同的数据,请使用IStream::Seek(). 例如,要回到流的开头:

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

并非所有流都支持搜索,因此您应该始终检查返回码是否有错误。

于 2013-08-06T09:55:52.310 回答