我有以下问题:一个用 Objective-C 编写的 iOS 应用程序(像往常一样),它使用用 C 编写的部分代码。C 代码是应用程序的核心,用 Objective-C 编写的代码使用 C 完成的工作并协调整个应用程序。
为了完成它的工作,C 代码从首选项文件中读取一些内容,该首选项文件的名称在 C 文件中连接。是否可以(在 C 代码中)在运行时而不是在编译时读取文件名?这个想法是用 Objective-C 修改一个字符串,让 C 代码读取那个字符串。
我有以下问题:一个用 Objective-C 编写的 iOS 应用程序(像往常一样),它使用用 C 编写的部分代码。C 代码是应用程序的核心,用 Objective-C 编写的代码使用 C 完成的工作并协调整个应用程序。
为了完成它的工作,C 代码从首选项文件中读取一些内容,该首选项文件的名称在 C 文件中连接。是否可以(在 C 代码中)在运行时而不是在编译时读取文件名?这个想法是用 Objective-C 修改一个字符串,让 C 代码读取那个字符串。
看起来你在 C 文件中有一个硬编码的文件名。这不是一个好的设计。在 iOS 应用程序中,您永远不知道路径名称是什么,并且当前文件夹的概念在 GUI 应用程序中是混乱的。使文件名成为 C 函数的参数,并从 Objective C 端传递它以及完整路径。根据文件的位置,它可以在您的应用程序包中,或在文档文件夹中,或其他地方 - 您知道得更好。
是的,您可以将文件名设为变量而不是常量。变量数据类型将是char*
.
编辑回复:评论:要解决此问题,请尝试从 ObjC 端设置当前文件夹。在调用 C 函数之前, call [NSFileManager setCurrentDirectoryPath:]
,传递文件所在的文件夹(同样,我不知道它可能是什么)。然后硬编码的文件名就可以工作了。
假设您的.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()
。
当然,这都是假设,但这就是我必须处理的全部内容。