在iOS的.c文件中读取.txt文件
背景 我正在开发一个应用程序,它调用我的公司以前用(普通)C编写的库。我的应用程序的主要部分是用Obj-C编写的。在C代码中的某一点上,库需要打开并从.txt文件读取数据。txt文件将由Obj-C在应用程序的主要部分创建在iOS的.c文件中读取.txt文件,ios,objective-c,c,io,Ios,Objective C,C,Io,背景 我正在开发一个应用程序,它调用我的公司以前用(普通)C编写的库。我的应用程序的主要部分是用Obj-C编写的。在C代码中的某一点上,库需要打开并从.txt文件读取数据。txt文件将由Obj-C在应用程序的主要部分创建 问题 我无法用C代码找到.txt文件。具体来说,当我尝试fopen文件并将其分配给file变量时,该变量始终为NULL。现在,该文件正在写入我的应用程序的Documents文件夹(但如果这是问题所在,那么我可以更改它)。我已经启用了文件共享,因此我能够通过iTunes验证该文
问题 我无法用C代码找到.txt文件。具体来说,当我尝试
fopen
文件并将其分配给file
变量时,该变量始终为NULL
。现在,该文件正在写入我的应用程序的Documents文件夹(但如果这是问题所在,那么我可以更改它)。我已经启用了文件共享,因此我能够通过iTunes验证该文件是否正确写入并存在于Documents文件夹中
我的尝试 以下是我到目前为止尝试的一些代码 应用程序内:
NSURL *docs = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
const char *dir = [docs UTF8String];
myLibraryEntryPoint(dir,(int)[docs length]);
图书馆:
char *new_str;
if ((new_str = malloc(strlen(directory)+strlen("/myFile.txt")+1)) != NULL)
{
new_str[0] = '\0';
strcat(new_str,directory);
strcat(new_str,"/myFile.txt");
}
else
{
fprintf(stderr, "malloc failed!");
}
FILE *fp=fopen(new_str, "r");
我在图书馆也尝试了以下方法:
FILE *fp=fopen("Documents/myFile.txt", "r");
FILE *fp=fopen("/Documents/myFile.txt", "r");
FILE *fp=fopen("myFile.txt", "r");
FILE *fp=fopen("/myFile.txt", "r");
FILE *fp=fopen("Documents\myFile.txt", "r");
FILE *fp=fopen("Documents\\myFile.txt", "r");
FILE *fp=fopen("\Documents\myFile.txt", "r");
FILE *fp=fopen("\\Documents\\myFile.txt", "r");
如上所述,fp
在每次尝试后总是NULL
在iOS环境中,用c打开文件的正确语法是什么?我没有对我的项目的构建设置进行任何更改,以更改工作目录,正如前面所述,因为与这些问题不同,我的应用程序正在创建.txt文件本身
分辨率 结果表明,文件路径区分大小写。我的库正在查找
myFile.TXT
,我的应用程序正在那里写入myFile.TXT
。FML
我将把这个问题留在这里,因为我认为在评论和建议的答案中有一些关于文件路径语法以及库如何处理当前目录的好信息。这些信息将来可能对其他人有用。在objective-C中,可以像这样访问
文档
目录的路径:
NSString *documentsPath = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES)[0];
在C中使用此类NSString路径时,必须将NSString转换为UTF8字符串:
NSString *fullPath = [documentPath stringByAppendingPathComponent:@"myFile.txt"];
File *f = fopen(fullPath.UTF8String, "r");
请注意,fopen()
C函数需要传递到所需文件的绝对路径才能打开它
如果fopen()
#include <stdio.h>
#include <errno.h>
#include <string.h>
File *fileHandler = fopen( fullPathToFileAsUTF8String, openMode );
if( fileHandler == NULL ) {
fprintf(stderr, "File open error: %s\n", strerror(errno));
}
#包括
#包括
#包括
File*fileHandler=fopen(fullPathToFileAsUTF8String,openMode);
if(fileHandler==NULL){
fprintf(stderr,“文件打开错误:%s\n”,strerror(errno));
}
我认为您第一次尝试的问题是,您正在将URL传递给需要路径的库函数。尝试:
NSURL *docs = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSString *docsPath = docs.path;
const char *dir = [docsPath UTF8String];
myLibraryEntryPoint(dir,(int)[docsPath length]);
他也有类似的问题。我有一个C语言的库,在那里我需要读写文件
我编写了以下代码以查找应用程序的Documents文件夹的路径:
char path[256] = {0};
strcpy(path, getenv("HOME"));
strcpy(path, "/Documents/file.txt");
FILE *file = fopen(path, "r");
由于您正在处理相对路径,能否尝试打印当前目录<代码>放置(getcwd())代码>IIRC。不要尝试出错,而是使用调试器并使用文件的绝对路径/myFile.txt
是一个绝对路径,但很可能不是文件所在的路径!并提供一个@Jean-Françoisfab:我应该放置put(getcwd())代码>在我的C代码库中,对吗?如果我只是键入那一行,它会抛出一个编译器错误-getcwd
部分不会显示在自动完成中,因此我想知道这是否不受支持?请尝试使用包含行:#include char*getcwd(char*buf,size\u t size)
但可能不支持它。@GeneralMike:是的,您的进程似乎以根目录作为当前目录开始。你必须将chdir指向你的应用程序目录或提供它的完整绝对路径。这与我在我的尝试中列出的第一部分中所做的不一样吗?库是一个.c文件,这意味着我不能在该文件中包含任何obj-c代码。c字符串与UT8字符串不同。我使用的是UTF8String
。我试过使用NSSearchPathForDirectoriesInDomains
,看起来没有改变任何东西。因此,应用程序创建的文件可能没有关闭。尝试打开您使用iTunes文件共享手动创建的文件。这是一个好主意。我复制了该文件,在名称的末尾添加了一个2
,将其放回iTunes,并在库中更改代码以查找2
文件,但它仍然没有找到它。