【问题标题】:Using fopen() in Objective-C在 Objective-C 中使用 fopen()
【发布时间】:2011-11-17 23:50:04
【问题描述】:

我对由于这部分代码的错误而不断崩溃感到困惑:

                FILE *fid200;
                fid200 = fopen ( "Length200Vector.txt" , "w" );
                if (fid200 == NULL)
                    perror("Error opening Length200Vector.txt");
                for (int n = 0; n<200; n++) {
                    if (n == 0) {
                        fprintf (fid200, "%f", self.avgFeatureVect[0][n]);
                    }
                    else {
                    fprintf (fid200, ", %f", self.avgFeatureVect[0][n]);
                    }
                }
                fprintf (fid200, "\n");
                fclose(fid200);

错误是:打开Length200Vector.txt时出错:不允许操作。

该文件位于我的项目的 Resources 文件夹中,并且此行正在 .mm 文件中执行。在 .cpp 文件中的同一个项目中,我使用几乎完全相同的代码,可以毫无问题地运行。这个好像看不出来。。。

谢谢

【问题讨论】:

  • 代码是否在执行的较早时间点运行chdir(2)fchdir(2)ls -l Length200Vector.txt ; ls -ld . ; id 的输出是什么?不相关——为什么复杂的if (n == 0) 显然什么都不做?
  • 把这个放在你的fopen 行之前:NSLog(@"wd = %@", [[NSFileManager defaultManager] currentDirectoryPath]); 它会打印你的资源目录路径吗?
  • 这是 Mac OS X 应用还是 iOS 应用?
  • 请记住perror() 只是打印一条错误消息;它不会终止您的程序。如果fopen() 调用失败,您仍然尝试写入文件(所有fprintf() 调用也应该失败)。
  • sarnold - chdir(2) 和 fchdir(2) 不运行。 n==0 是所以第一个条目前面没有“,”。 rob mayoff - 这是一个 iOS 应用程序,NSLog 语句打印:wd = /private/var/mobile/Applications/DF60ABC3-95A7-40DD-A3F2-D1FD493138E4/cashconverter.app

标签: c++ objective-c ios fopen stdio


【解决方案1】:

关于您认为这是一个 iOS 应用程序的评论:您不允许(就 iOS 沙箱而言)对 iOS 中的任何内容执行 修改(fopen() 中的“w”)文件访问除了位于应用程序“Documents”目录中的文件之外的应用程序(或对于一般应用程序资源,~/Library/Application Support/“bundle ID”目录和临时文件,通过调用 NSTemporaryDirectory() 函数返回的目录[1])。

通过类似这样的方式访问“文档”目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docs_dir = [paths objectAtIndex:0];

如果您已经有一个资源文件需要在应用执行期间进行修改,您必须先将其复制到“Doc​​uments”目录,然后再进行修改。

[1]http://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW1

【讨论】:

  • 这不太对。除了文档目录之外,还有其他目录可以写入(例如,caches/temp 目录、库目录中的其他位置)。关键是您无法写入资源所在的应用程序包。
  • 你是对的。我将查找参考并相应地编辑我的答案。
  • 我通过更改 Targets -> Signing and Capabilities -> App Sandbox -> File Access Type -> User Selected File permission and access 中的设置解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多