Ios 有没有一种方法可以让相同的字符串从C和Objective-C中可读和可编辑?

Ios 有没有一种方法可以让相同的字符串从C和Objective-C中可读和可编辑?,ios,objective-c,c,Ios,Objective C,C,我有以下问题:通常使用Objective-C编写的iOS应用程序使用C编写的部分代码。C代码是应用程序的核心,使用Objective-C编写的代码使用C完成的任务并协调整个应用程序 为了完成它的工作,C代码从一个首选项文件中读取一些内容,该文件的名称被连接到一个C文件中。在C代码中,是否可以在运行时而不是编译时读取文件名?其思想是使用Objective-C修改字符串,并让C代码读取该字符串。看起来您在C文件中有一个硬编码的文件名。这不是一个好的设计;在iOS应用程序中,你永远不知道你的路径名是什

我有以下问题:通常使用Objective-C编写的iOS应用程序使用C编写的部分代码。C代码是应用程序的核心,使用Objective-C编写的代码使用C完成的任务并协调整个应用程序


为了完成它的工作,C代码从一个首选项文件中读取一些内容,该文件的名称被连接到一个C文件中。在C代码中,是否可以在运行时而不是编译时读取文件名?其思想是使用Objective-C修改字符串,并让C代码读取该字符串。

看起来您在C文件中有一个硬编码的文件名。这不是一个好的设计;在iOS应用程序中,你永远不知道你的路径名是什么,而当前文件夹的概念在GUI应用程序中是混乱的。将文件名作为C函数的参数,并从目标C端传递它,同时传递完整路径。根据文件的位置,它可以在应用程序的捆绑包中,也可以在文档文件夹中,或者在其他地方——你知道得更清楚

是的,您可以将文件名设置为变量而不是常量。变量数据类型应为char*


编辑re:comments:若要解决此问题,请尝试从ObjC端设置当前文件夹。在调用C函数之前,调用[NSFileManager setCurrentDirectoryPath:],再次传递文件所在的文件夹,我不知道它可能是什么。然后硬编码文件名就可以工作了。

看起来C文件中有硬编码文件名。这不是一个好的设计;在iOS应用程序中,你永远不知道你的路径名是什么,而当前文件夹的概念在GUI应用程序中是混乱的。将文件名作为C函数的参数,并从目标C端传递它,同时传递完整路径。根据文件的位置,它可以在应用程序的捆绑包中,也可以在文档文件夹中,或者在其他地方——你知道得更清楚

是的,您可以将文件名设置为变量而不是常量。变量数据类型应为char*

编辑re:comments:若要解决此问题,请尝试从ObjC端设置当前文件夹。在调用C函数之前,调用[NSFileManager setCurrentDirectoryPath:],再次传递文件所在的文件夹,我不知道它可能是什么。然后硬编码文件名就可以工作了。

假设您的.c文件如下所示:

#include <stdbool.h>

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

bool readPrefs() {

    FILE *fp = fopen(_prefsFilename, "r");
    ....
}
并确保在调用readPrefs之前调用它

当然,这都是假设,但这就是我要处理的全部内容。

假设您的.c文件如下所示:

#include <stdbool.h>

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

bool readPrefs() {

    FILE *fp = fopen(_prefsFilename, "r");
    ....
}
并确保在调用readPrefs之前调用它



当然,这都是假设,但这就是我要处理的所有问题。

您是在问如何将NSString转换为const char*?因为这很直截了当。当你说在运行时而不是在编译时读取文件名时,你指的是什么文件?我指的是C代码为完成任务而从中读取内容的文件仍然没有足够的信息。与应用程序相关的此文件在哪里?您是否希望应用程序的Objective-C代码告诉C代码文件要读取,这是您的问题吗?是的,它不记得硬编码,请原谅您是否询问如何将NSString转换为const char*?因为这很直截了当。当你说在运行时而不是在编译时读取文件名时,你指的是什么文件?我指的是C代码为完成任务而从中读取内容的文件仍然没有足够的信息。与应用程序相关的此文件在哪里?你想让应用程序的Objective-C代码告诉文件读取的C代码,是你的问题吗?是的,它不记得硬编码,抱歉我不能修改C方法的签名,我可以修改它的行为…@Massimo,你不能添加函数?是的,我可以,但是C代码非常难,我不能修改调用方法的顺序。@Massimo所以你想更改它,但不能。我看你哪儿也去不了。在调用任何其他函数之前,您需要添加一个附加函数;类似于setPrefsFilenameconst char*filename;。很遗憾,我不能修改C方法的签名,只能修改它的行为…@Massimo,你不能添加函数吗?是的,我可以,但C代码非常难,我不能修改调用方法的顺序。@Massimo所以你想更改它,但不能。我看你哪儿也去不了。在调用任何其他函数之前,您需要添加一个附加函数;类似于setPrefsFilenameconst char*filename;。