gpt4 book ai didi

c++ - 从 std::istream 读取 SDL_RWops

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:59 26 4
gpt4 key购买 nike

我很惊讶 Google 没有找到解决方案。我正在寻找一种允许 SDL_RWops 与 std::istream 一起使用的解决方案。 SDL_RWops 是在 SDL 中读取/写入数据的替代机制。

是否有指向解决该问题的网站的链接?

一个明显的解决方案是将足够的数据预读到内存中,然后使用 SDL_RWFromMem。但是,这样做的缺点是我需要事先知道文件大小。

似乎这个问题可以通过“覆盖”SDL_RWops 函数以某种方式解决...

最佳答案

我觉得不好回答我自己的问题,但它困扰了我一段时间,这是我想出的解决方案:

int istream_seek( struct SDL_RWops *context, int offset, int whence)
{
std::istream* stream = (std::istream*) context->hidden.unknown.data1;

if ( whence == SEEK_SET )
stream->seekg ( offset, std::ios::beg );
else if ( whence == SEEK_CUR )
stream->seekg ( offset, std::ios::cur );
else if ( whence == SEEK_END )
stream->seekg ( offset, std::ios::end );

return stream->fail() ? -1 : stream->tellg();
}


int istream_read(SDL_RWops *context, void *ptr, int size, int maxnum)
{
if ( size == 0 ) return -1;
std::istream* stream = (std::istream*) context->hidden.unknown.data1;
stream->read( (char*)ptr, size * maxnum );

return stream->bad() ? -1 : stream->gcount() / size;
}

int istream_close( SDL_RWops *context )
{
if ( context ) {
SDL_FreeRW( context );
}
return 0;
}


SDL_RWops *SDL_RWFromIStream( std::istream& stream )
{
SDL_RWops *rwops;
rwops = SDL_AllocRW();

if ( rwops != NULL )
{
rwops->seek = istream_seek;
rwops->read = istream_read;
rwops->write = NULL;
rwops->close = istream_close;
rwops->hidden.unknown.data1 = &stream;
}
return rwops;
}

在 istream 永远不会被 SDL 释放(并且它们在整个操作过程中存在)的假设下工作。此外,只有 istream 支持,将为 ostream 完成一个单独的函数——我知道我可以传递 iostream,但这不允许将 istream 传递给转换函数:/。

欢迎提供有关错误或升级的任何提示。

关于c++ - 从 std::istream 读取 SDL_RWops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com