为什么从 Swift (Xcode) 调用时 fstream 不工作?

Why doesn't fstream work when called from Swift (Xcode)?

我正在开发一个 Xcode 项目,比较 Metal 和 OpenGL 的渲染。

它分为 2 个不同的目标,因此 Metal 部分在 Swift 中,而 OpenGL 部分在 C++ 中。

我制作了一个 C++ class 用于模型加载,供他们两个访问。 OpenGL(C++) 部分直接访问它,而 Metal 部分有一些 Objetice-C++ 代码可以桥接,因此它可以与 Swift 一起工作。 ModelLoader 构造函数看起来像这样:

ModelLoader(const char*  modelPath)
{
    fstream modelFileStream(modelPath);
    string line;
    if (modelFileStream.is_open())
    {
        while (getline(modelFileStream, line))
        {
            // obj parsing
        }
        modelFileStream.close();
    }
    else
    {
        cout << "Failed to open model file at path: " << modelPathString << endl;
    }
}

问题是,当我直接在 OpenGL (C++) 目标上使用它时工作正常,但是当我在我的 Metal (Swift) 目标上使用它时,它无法成功打开文件并打印“无法在路径打开模型文件:(参数使用的路径)”。

我已经尝试过使用相对路径(通过“编辑方案”>“使用自定义工作目录”)和绝对路径。两者都适用于 OpenGL 版本,但不适用于 Metal 版本。还尝试直接在 ModelLoader 构造函数上对路径进行硬编码,但什么也没有。

与 Objective-C++ 的桥接似乎也能正常工作,因为它会打印消息。两个目标中打印的路径完全相同,所以这不是桥接完成的。

所以这是怎么回事?

在权利中禁用“App Sandbox”解决了这个问题。