我正在尝试使用 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() 时;这个缓冲区已经分配了一些内存我的意思是第二次调用缓冲区指向不是从零开始的地址(但它应该按照我的想法这样做)
最佳答案
流就像普通文件一样,它们本质上是顺序的,一旦您读取了数据,“读取游标”就会前进,再次调用 Read()
将读取更多数据,等等。
要向后查找以再次重新读取相同的数据,请使用 IStream::Seek()
。例如,返回到流的开头:
LARGE_INTEGER li = { 0 };
HRESULT hr = pStream->Seek(li, STREAM_SEEK_SET, NULL);
并非所有流都支持查找,因此您应该始终检查返回码是否有错误。
关于c++ - 读取动态创建的缓冲区的内容,为第二次调用函数提供错误的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18074611/