在iOS中使用C/C++写入文件

11

在iOS中,是否可以使用C/C++调用创建文本文件?然后是否可以从应用程序外部打开和读取该文件?也就是说,应用程序A在它有写入权限的某个地方创建一个文本文件,然后应用程序B从该文件中读取。或者,忘记应用程序B,我能否只是打开并读取它?


你想写什么?Objective-C对象吗? - Ludovic Landry
打印文本消息的简单 printf 语句。 - 341008
2个回答

25

由于问题明确要求使用C/C++而不是Obj-C,因此我添加了这个答案,我在这里看到了它,希望对某些人有所帮助:

char buffer[256];

//HOME is the home directory of your application
//points to the root of your sandbox
strcpy(buffer,getenv("HOME"));

//concatenating the path string returned from HOME
strcat(buffer,"/Documents/myfile.txt");

//Creates an empty file for writing
FILE *f = fopen(buffer,"w");

//Writing something
fprintf(f, "%s %s %d", "Hello", "World", 2016);

//Closing the file
fclose(f);

使用以下 C 代码:

buffer = "/private/var/mobile/Containers/Data/Application/6DA355FB-CA4B-4627-A23C-B1B36980947A/Documents/myfile.txt"

虽然 Obj-C 版本:

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

正在返回

documentsDirectory = /var/mobile/Containers/Data/Application/6DA355FB-CA4B-4627-A23C-B1B36980947A/Documents

顺便提一下,如果你注意到了关于“私人”的小差异,我写信给这两个地方,结果他们是相同的。


我应该在哪里使用文件应用程序或iTunes/Xcode找到文件呢? - kakyo
我保存文件后找不到了。我很确定我按照您展示的用C语言确切地操作了,但在连接到 Mac 后无法找到它。 - kakyo

6

可以。

使用NSFileHandle获取对文件的读/写访问权限,使用NSFileManager创建目录并列出其内容以及进行所有其他类型的文件系统访问。

请记住,每个应用程序都是沙盒化的,并且只能写入其自己指定的目录。您可以使用以下代码获取这些目录的路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

然而,您无法访问另一个应用程序的文件。

iTunes会自动备份这些目录,因此如果用户进行设备还原,则会自动恢复它们。同时请注意不要以文件浏览器或“保存对话框”等形式向应用程序用户“公开”文件系统。


7
我知道如何在 Obj-C 中实现,但我想仅使用 C/C++ 调用。我听说这是可能的,但不知道具体怎么做。此外,我以后需要手动读取该文件,因此我必须从应用程序外部访问它。 - 341008
在这种情况下,您可以使用标准的C函数,如fopen()。然而,这比使用更高级别的API要不方便得多。将文件“稍后可用”唯一的方法是将它们放入应用程序的文档目录中,并正确配置bundle.plist,以便可以使用iTunes的文件管理器添加/删除这些文件。 - BastiBen
1
太好了!但是我如何仅使用C调用获取文档目录? - 341008
我怀疑你很难轻松地做到这一点。应用程序路径中的UUID是随机的,并且没有获取路径的“纯C”变体NSSearchPathForDirectoriesInDomains方法。如果可以问,为什么不能使用更高级别的API? - BastiBen
3
可以混合使用C++和Objective-C。据我所知,只需要将文件后缀更改为“.mm”,这样Xcode才能正确调用编译器。只要确保有一个实际的UIApplication正在运行(带有自动释放池),否则可能会出现一些问题。 - BastiBen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接