gpt4 book ai didi

c - 为什么使用 SDL I/O 函数而不是 stdio 函数?

转载 作者:行者123 更新时间:2023-12-04 12:26:30 26 4
gpt4 key购买 nike

SDL 包含许多处理以 SDL_RWops 结构为中心的 I/O 的函数。它们中的很多都与 stdio I/O 函数非常相似,以至于它们使用相同样式的字符串。例如,fopen 与 SDLRWFromfile。

为什么会出现这种情况?我是否应该针对标准库使用 SDL I/O 函数? SDL 功能是否更便携?

最佳答案

SDL_RWops 的兴趣是它只是一个接口(interface)结构,带有用于读取/写入/查找/关闭的函数指针...

typedef struct SDL_RWops {
/** Seek to 'offset' relative to whence, one of stdio's whence values:
* SEEK_SET, SEEK_CUR, SEEK_END
* Returns the final offset in the data source.
*/
int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence);

/** Read up to 'maxnum' objects each of size 'size' from the data
* source to the area pointed at by 'ptr'.
* Returns the number of objects read, or -1 if the read failed.
*/
int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum);

/** Write exactly 'num' objects each of size 'objsize' from the area
* pointed at by 'ptr' to data source.
* Returns 'num', or -1 if the write failed.
*/
int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num);

/** Close and free an allocated SDL_FSops structure */
int (SDLCALL *close)(struct SDL_RWops *context);
// ... there are other internal fields too
}

例如使用 SDL_LoadBMP 时, SDL 创建一个 SDL_RWops来自文件句柄的对象,但您也可以创建 SDL_RWops来自其他来源的对象,例如内存位置,例如对于不提供 native 文件系统的系统(想到 Nintendo DS,即使像 R4 或 M3 这样的自制链接器推车通常能够提供这样的服务)。

来自 SDL_Video.h :
/**
* Load a surface from a seekable SDL data source (memory or file.)
...
*/
extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc);

/** Convenience macro -- load a surface from a file */
#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)

所以 SDL_LoadBMP是一个调用 SDL_RWFromFile(file, "rb") 的宏,它当然使用标准库来创建文件句柄并创建 SDL_RWop函数指针初始化为现有标准库的对象 read , write , seek , close职能。

在这种情况下,您可以将您的 Assets 硬编码在可执行二进制文件中作为字节数组,并映射一个 SDL_RWops该内存上的对象。

因此,对于 SDL 函数,您必须使用它们(即使它们的使用是隐藏的)。但是,如果您有其他资源文件(如音频、配置文件)没有提供给 SDL,则可以使用标准库来读取它们。

关于c - 为什么使用 SDL I/O 函数而不是 stdio 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700812/

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