首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mac osx c++ .app找不到文件fopen()

Mac osx c++ .app找不到文件fopen()
EN

Stack Overflow用户
提问于 2011-09-17 10:37:02
回答 3查看 4.4K关注 0票数 4

我在与mac .app相同的目录中有一个文件夹,其中有一个名为test.ssm的文件。此函数正在尝试打开此函数:

代码语言:javascript
复制
FILE *input_file = fopen("./data/maps/test.ssm", "r");

问题是应用程序总是得到这样的代码: EXC_BAD_ACCESS,因为它不能打开这个文件。我的项目是使用普通的coccoa项目在xcode中设置的。这是一个opengl/glut应用程序。

EN

回答 3

Stack Overflow用户

发布于 2011-09-17 10:43:34

问题是.app是一个包,因此它实际上也是一个目录结构,而不是一个“普通”文件。实际的可执行文件在目录YourApp.app/Contents/MacOSX/中。因此,当您使用以./开头的相对路径在C代码中打开文件时,可执行文件实际上是在YourApp.app/Contents/MacOSX/目录中查找您的文件,而不是在安装.app软件包的父目录中查找。

您实际上可以通过右键单击.app并选择View Package Contents来浏览它的目录结构。

如果您要将文件放在您希望从可执行文件访问的文件系统中,请将它们打包到.app中,或者将它们放在.app之外,并在您的文件访问中放置足够的../,以使您脱离.app目录结构,进入安装.app的父目录。

如果希望/data目录位于.app包中,那么只需在路径中添加足够的../,就可以使您离开/MacOSX目录,进入.app的根目录,/data目录就在这里。

最后,如果您需要知道可执行文件所在的绝对路径,您可以始终使用mach-o/dyld.h中的C函数_NSGetExecutablePath (即,您不需要objective-C)。在此基础上,您可以修改路径,使其位于文件系统中相对于可执行文件所在位置的任何其他目录,方法是将其修剪为适当的父目录,然后将路径名附加到要打开的文件。

票数 2
EN

Stack Overflow用户

发布于 2014-02-16 14:37:25

您必须在Mac中提供绝对文件路径,因为Mac是为处理文件对话框或类似的东西而构建的。

票数 1
EN

Stack Overflow用户

发布于 2011-09-17 10:58:58

如上所述,.app是一个包,或者是Mac将其视为文件的特殊文件夹。正在运行的不是.app,正在运行的是your.app/Contents/MacOS/your,当前目录是your.app/Contents/MacOS/。如果你不介意在你的应用程序中使用Objective-C (如果你还没有链接Foundation.framework,我建议你找到另一种方法),你可以这样做来获得应用程序包的路径:

代码语言:javascript
复制
const std::string GetApplicationDirectory()
{
    id info = [[NSBundle mainBundle] infoDictionary];
    NSString *bundleID = [info objectForKey: @"CFBundleIdentifier"];

    NSWorkspace *wp = [[NSWorkspace alloc] init];
    NSString *app   = [wp absolutePathForAppBundleWithIdentifier: bundleID];

    const char *str = [[app substringToIndex: [app length] - [[app lastPathComponent] length]]] cStringUsingEncoding: NSASCIIStringEncoding];
    return std::string( str );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7452076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档