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

C++ 使用C/C+;在iOS中写入文件+;,c++,c,ios,file-io,C++,C,Ios,File Io,可以在iOS中使用C/C++调用创建文本文件吗?然后是否可以从应用程序外部打开并读取文件?也就是说,应用程序A在其具有写入权限的位置创建一个文本文件,然后应用程序B从中读取。或者,忘记应用程序B,我可以打开它并阅读吗?是的 使用NSFileHandle获取对文件的读/写访问权限,使用NSFileManager创建目录并列出其内容,以及执行所有其他类型的文件系统访问 请记住,每个应用程序都是沙盒,只能写入自己指定的目录。您可以使用如下代码获取这些目录的路径: NSArray *paths = NS

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

是的

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

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

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
但是,您无法访问其他应用程序的文件


iTunes会自动备份这些目录,因此如果用户执行设备还原,这些目录会自动还原。还请记住,您不应该以文件浏览器或“保存对话框”等形式向应用程序用户“公开”文件系统。

因为问题明确要求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

仅供参考,如果你注意到“私人”的细微差别,我给这两个地方都写了信,它们碰巧是一样的。

你想写什么?Objective-C对象?用于打印文本消息的简单
printf
语句。我知道如何在Obj-C中执行此操作。我只想使用C/C++调用。我听说这是可能的,但不知道怎么做。另外,我想稍后手动读取该文件,因此,我必须从应用程序外部访问它。但是,这比使用更高级的API更不方便。“使文件稍后可用”的唯一方法是将它们放入应用程序的Documents目录中,并正确配置bundle.plist,以便使用iTunes的文件管理器添加/删除这些文件。太棒了!但是我如何只使用C调用来获取文档目录呢?我怀疑你能很容易地做到这一点。应用程序路径中的UUID是随机的,并且没有NSSearchPathForDirectoriesInDomains方法的“普通C”变体来获取路径。如果我可以问,为什么你不能使用更高级的API?你可以混合C++和Objule.C.AfAIK,你只需要把文件后缀改成“.mm”,这样Xcode就知道如何正确调用编译器。只需确保您有一个实际的UIApplication正在运行(带有AutoreleasePool),否则您可能会遇到一些问题。那么,使用文件应用程序或iTunes/Xcode在哪里找到该文件?保存后,我找不到该文件。我很确定我用C做的和你展示的完全一样,但是当连接到Mac时找不到它。