在C程序中抽象文件系统的方法
Method for abstracting filesystems in a C program
我正在SDL中启动一个程序,该程序显然需要为文件系统加载资源。我希望程序中的文件调用与平台无关。我最初的想法是定义一个宏(让我们称之为PTH作为路径),该宏是在预处理器中根据系统类型定义的,然后使用它在程序中进行文件调用。例如
SDL_LoadBMP(PTH("data","images","filename"));
将简单地转换为与文件系统相关的内容。
如果宏是可以接受的方法,那么这样的宏会是什么样子(我如何检查正在使用的系统,在宏中连接字符串?)
如果没有,可以接受的方式是什么?
Boost文件系统模块可能是您的最佳选择。它在路径上覆盖了"/"运算符,因此您可以执行以下操作。。。
ifstream file2( arg_path / "foo" / "bar" );
GLib有许多可移植的路径操作函数。如果您更喜欢C++,还有boost::filesystem。
没有必要将其作为宏。
一种常见的方法是抽象路径,使用正斜杠作为分隔符,因为这(几乎是意外的!)很好地映射到了很大一部分实际平台。对于那些没有的,您只需在文件系统实现层内部进行转换。
查看OS9 os.path.join(macpath)的python实现
def join(s, *p):
path = s
for t in p:
if (not s) or isabs(t):
path = t
continue
if t[:1] == ':':
t = t[1:]
if ':' not in path:
path = ':' + path
if path[-1:] != ':':
path = path + ':'
path = path + t
return path
我不熟悉在SDL下在旧Mac上进行开发。游戏资源中的另一个替代方案是使用包文件格式,并将资源直接加载到内存中(例如map<string,SDL_Surface>)
因此,您将加载一个文件(甚至可能是一个zip,在加载时解压缩)
我只需在程序的启动代码中执行chdir(data_base_dir);
的平台等效版本,然后使用形式为"images/filename"
的相对unix样式路径。最后一个不起作用的系统是MacOS9,现在它已经完全不相关了。
相关文章:
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- libstdc++ 文件系统中未初始化的用法?
- boost::文件系统::recursive_directory_iterator多线程安全
- C++17 文件系统::remove_all 带有通配符路径
- 实验性文件系统库不完整C++?
- 使用文件系统时仍然需要链接到带有 C++20 的 stdc++fs?
- 无法链接文件系统库C++
- 无法识别 Mac c++ 文件系统库
- 使用Boost文件系统C++将具有特定扩展名的文件的名称保存在特定文件夹中
- 获取 clang++:错误:在编译文件系统库的代码时
- C++17 文件系统在 Windows 10 上使用 nuwen MinGW
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 如何修复 MinGW 文件系统探针?
- 将 boost::文件系统::p ath 转换为 char?
- 我可以在 ndk 中使用带有 libc++ 的实验性文件系统吗?
- 返回混合 \ 和 / 的文件系统路径字符串方法
- 在C程序中抽象文件系统的方法