【问题标题】:Xcode can't find files that exist (using c++ fopen)Xcode 找不到存在的文件(使用 c++ fopen)
【发布时间】:2021-09-26 05:43:29
【问题描述】:

我最近遇到了这个奇怪的问题,在我的 Xcode 中的 Cocoa 应用程序项目中,当使用从 C++ 文件调用的“fopen”(errno 2)时,我收到了找不到文件的错误。我确保将这些文件复制到项目目录中,然后将它们从 Finder 目录拖到 Xcode 项目树中。最后,在方案的选项中,我检查了“使用自定义目录”并输入了我拥有项目和所有文件的目录。该程序构建良好,但在运行时出现 BAD ACCESS 错误,我可以看到我的 FILE* 变量仍然为 NULL。抛出异常的命令实际上是在两行之后“fread”,但这只是因为“fopen”没有完成它的工作。

整个设置之前在纯 C++ 项目中运行良好。但这是不同的,因为它是作为 Objective-C 中的 Cocoa 应用程序开始的(因为我打算使用 C++ 作为程序的主要逻辑)。在某些时候,我还必须将所有“.m”文件的扩展名更改为“.mm”,否则编译器甚至找不到 C++ 标准库! (但这可能是题外话)

所以问题是......我还需要检查什么才能让程序找到我要打开的文件?

注意:项目的主干是用 C++ 编写的,我使用 Cocoa 只是为了能够在屏幕上绘制图像,所以如果有人有更好的方法在 C++ 项目中包含图形我'我都在听。

感谢阅读

编辑:我正在使用 Xcode 12.4 和 Catalina 10.15.7

【问题讨论】:

  • 您想了解当前工作目录是什么以及它与 exe 或源文件位置有何不同。你可以从这里开始How to get the current directory in a C program?
  • 您是否在调试模式下从 Xcode 运行应用程序?应用程序是否被沙盒化?您的应用是否有权读取该文件?
  • @S.M.我会检查一下谢谢!
  • @Willeke 是的,我现在正在运行调试模式。是的,它有权读取文件。它是沙盒的吗?我会看看那个。谢谢

标签: c++ xcode cocoa


【解决方案1】:

Cocoa 应用程序处理文件的方式与命令行 C++ 应用程序不同。 Cocoa 应用程序创建一个应用程序包,这是您要读取的文件所在的位置。如果您有想要在 Cocoa 应用程序中读取的文件,请将它们添加到项目中。当您将文件添加到项目中时,它们将被复制到应用程序包中。确保它们处于应用目标的 Copy Bundle Resources 构建阶段。

使用Bundle 类中的方法而不是fopen 来定位文件。以下 Swift 代码在主应用程序包中找到名为“MyFile.txt”的文件:

let mainBundle = Bundle.main
let fileURL = mainBundle.url(forResource: "MyFile", withExtension: "txt")

【讨论】:

  • 马克。感谢您的回复。您的解释很有意义,因为我只在 Cocoa 应用程序中遇到了这个问题。您发布的代码虽然是 Swift,但我正在使用 Objective-C。我在一个类似的线程上找到了这个建议:'NSString myFile=[[NSBundle mainBundle]pathForResource:@"subjects" ofType:@"plist"];'。有了这个,我可以得到带有文件路径的 const char 。阅读我获得的文件路径,我可以确认您的建议是正确的,该文件位于 Cocoa 应用程序中完全不同的位置。再次感谢,它现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 2011-11-19
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
相关资源
最近更新 更多