- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我很惊讶 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/
我很惊讶 Google 没有找到解决方案。我正在寻找一种允许 SDL_RWops 与 std::istream 一起使用的解决方案。 SDL_RWops 是在 SDL 中读取/写入数据的替代机制。 是
如题,SDL_RWops在处理I/O文件方面比std::fstream有什么优势吗?我可以改用 std::fstream 因为我更熟悉它吗? 最佳答案 通过阅读他们的文档,您可以发现 std::fst
我目前正在将我的爱好项目从 std::fstream 迁移到 SDL_RWops(因为 SDL_RWops 是我唯一的简单选择用于在 Android 上加载 Assets )。 从文件读取完美,但写入
我在使用 SDL2 + NDK 框架 (r9c) 时遇到了一个非常烦人的问题。 我将我的 .xml 和 .tmx 文件保存在 Assets 文件夹中。现在我使用 SDL_RWops 从 Assets
我是一名优秀的程序员,十分优秀!