Objective-C,如何将文件名传递给C函数?

时间:2012-06-05 04:54:53

标签: objective-c c arguments

我正在尝试将NSString传递给C函数,尽管它似乎不接受(或忽略)参数。任何帮助将不胜感激 - 谢谢。

int copyfiles(int argc, const char **argv)
{
    if(argc < 2 || argc > 3)
    {
        puts("usage: copy file [outfile]");
        return 1;
    }

    const char *infile = argv[1];
    char *outfile;
    if(argc > 2)
    {
        outfile = strdup(argv[2]);
        expect(outfile, "allocate");
    }
...
}

@implementation MyApplication 

@synthesize window;

    - (void)copy:(NSString *)pathToFile
    {
     NSString *pathToFile = @"/path/to/file";
     copyfiles((int)(const char *)[pathToFile UTF8String],(const char **)[pathToFile UTF8String]);
    }

我没有得到任何错误,但输出给了我“用法:复制文件[outfile]”,所以我显然没有正确地投射参数。

2 个答案:

答案 0 :(得分:4)

查看您对copyfiles的来电,特别是为什么您将字符串传递给想要第一个参数的整数的函数。

您需要为该函数传递一个参数 count ,然后是参数列表的指向指针。

例如,您可以使用以下C代码调用它(未经测试,但您应该得到一般的想法):

const char *args[] = {"copy", "fromfile", "tofile", NULL};
copyfiles (sizeof(args) / sizeof(*args) - 1, args);

第一行创建一个字符指针数组(更准确地说,C字符串),包括最终的NULL,这是ISO C标准规定的。

第二行传递两个参数,第一行是数组的大小减去1(列表中的“真实”参数的数量),第二行是数组本身。

在您的特定情况下,您似乎使用one-filename变种,您应该从以下内容开始:

char *args[3];
args[0] = "copy";
args[1] = [pathToFile UTF8String]; // watch out for auto-release here?
args[2] = NULL;
copyfiles (2, args);

因为你的C函数需要main类行为,其中第一个参数是“程序”名称。

答案 1 :(得分:2)

我不了解你,但我认为你的函数调用“(int)(const char *)[pathToFile UTF8String]”中的结果“copyfiles”可能是 但是 2或3.您在哪里找到示例代码,而不是基于此实现?

无论如何,将那个疯狂的演员变为2的常数(因为你所经过的只是一条路径),看看你是否有更好的结果。