2013-09-24 22 views
1

我有以下问题:用Objective-C编写的iOS应用程序(如往常一样),它使用用C编写的代码部分.C代码是应用程序的核心,用Objective-C编写的代码使用完成的工作由C和协调整个应用程序。有没有一种方法可以从C和Objective-C中读取和编辑相同的字符串?

为了完成它的工作,C代码从一个首选项文件中读取了一些东西,这个文件的名字被连接到一个C文件中。是否有可能(在C代码中)在运行时读取文件的名称,而不是在编译时?这个想法是用Objective-C修改一个字符串,并让C代码读取该字符串。

+0

你问如何将'NSString'转换为'const char *'?因为这非常简单。 –

+0

当你说“在运行时而不是在编译时读取文件的名称”时,你在说什么文件? – trojanfoe

+0

我正在谈论C代码读取文件的工作内容 – Massimo

回答

2

假设你.c文件看起来是这样的:

#include <stdbool.h> 

static const char *_prefsFilename = "userprefs.css"; 

bool readPrefs() { 

    FILE *fp = fopen(_prefsFilename, "r"); 
    .... 
} 

然后你只需要添加一个功能,让_prefsFilename试图用它来打开文件之前设置:

void setPrefsFilename(const char *prefsFilename) { 
    _prefsFilename = prefsFilename; 
} 

并确保在致电readPrefs()之前致电。

这当然都是假设,但这就是我必须要做的。

4

看起来你在C文件中有一个硬编码的文件名。这不是一个好设计;在iOS应用程序中,您永远不知道路径名是什么,并且当前文件夹的概念在GUI应用程序中混乱。使文件名称成为C函数的一个参数,并将其从Objective C一侧传递给完整路径。根据文件的位置,它可以位于应用程序的捆绑包中,也可以位于文档文件夹中,也可以位于其他位置 - 您知道的更好。

是的,你可以使文件名变成一个变量而不是常量。变量数据类型将是char*

编辑re:评论:要解决这个问题,请尝试从ObjC端设置当前文件夹。在调用C函数之前,调用[NSFileManager setCurrentDirectoryPath:],传递文件所在的文件夹(再次,我不知道它可能是什么)。然后,硬编码的文件名将起作用。

+0

可悲的是我不能修改C方法的签名,只是我可以修改它的行为... – Massimo

+1

@Massimo你不能添加函数? – trojanfoe

+0

是的,我可以,但C代码真的很难,我不能修改调用方法的顺序。 – Massimo

相关问题