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

时间:2011-09-17 02:37:02

标签: c++ macos fopen

我的mac .app目录中有一个文件夹,其中有一个名为test.ssm的文件。这是试图通过这个功能打开:

FILE *input_file = fopen("./data/maps/test.ssm", "r");

问题是应用程序不断获取代码:EXC_BAD_ACCESS,因为它无法打开此文件。我的项目已经使用普通的coccoa项目在xcode中设置。这是一个opengl / glut应用程序。

3 个答案:

答案 0 :(得分:2)

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

您可以实际浏览.app的目录结构,方法是右键单击它并选择.app

如果要将文件放在要从可执行文件中访问的文件系统中,请将它们打包到View Package Contents内,或者将它们放在.app之外,并放置足够{ {1}}在您的文件访问中,让您离开.app目录结构并进入安装../的父目录。

如果您希望.app目录位于.app包内,那么您只需在路径中添加足够的/data即可让您离开.app目录并进入../目录的根目录。

最后,如果您需要知道可执行文件所在的绝对路径,您始终可以使用/MacOSX内部的C函数.app(即,您不需要客观 - C)。从那里,您可以修改文件系统中任何其他目录的路径,相对于可执行文件的位置,将其修剪到正确的父目录,然后将路径名称附加到要打开的文件。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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 );
}