2012-11-02 27 views
3

我真的不知道该怎么问这个...命令行参数和文件输入的C

本来我想,开始读功能的文件,但我不知道会是怎样的文件名,我想读,因为文件名会在我的主要功能被传递作为命令行参数(argv [])

所以我主要的样子:

int main(int argc, char *argv[]) 

我的功能将类似于:

int get_corners(FILE *input, int size, and so on) 

我已经试过在我的功能:

*input = fopen(argv[1], "r"); 

但是,编译器说,它无法识别变量的argv

那么,能不能有人请帮助我了解如何给你打电话时,输入文件不是主要的,必须处理命令行参数?

+1

哪个编译器使用的是..这OS,你运行这个吗? – Krishnabhadra

+0

以及我正在使用UNIX –

回答

1

argv只是一个像其他任何函数一样的参数。除非您将其设置为全局或将其传递给“get_corners”,否则在该函数内不可见。

说实话,你可能更好地处理该文件与“get_corners”工作分开,它似乎是更干净。尝试有一个函数来打开和管理文件读取的错误,然后将其输出传递给get_corners。此外,您需要更仔细地解析命令行,而不是随便传递它。你可以看看* NIX中的getopts来帮助你,还有很多其他库可以使这个任务变得更容易。

FILE *readfile(filename) 
{ 
    FILE *f = fopen(filename, "r"); 
    // Do some error checking 
    return f; 
} 

main (int arc, char *argv[]) 
{ 
    FILE *myfile; 
    myfile = readfile(argv[1]); 
    get_corners(myfile, ...); 
} 
+0

好,问题在于函数定义已经由教师确定,因此不能有argv。全局变量也一样,我们不允许使用全局变量 –

+0

那么我的方法保持FILE指针本地,并保持你的函数签名相同。 :-) – Joe

+0

谢谢:)将尽力! –

5

首先你不应该取消引用FILE*,结构不透明。这意味着你只需传递指针。

其次你想要的可能是将你从命令行获得的文件名作为函数参数传递给你的函数。在C中,变量不是从其他函数的作用域继承的,无论是在运行时还是在编译时。

像这样的事情

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    return 1; 

    printf("%d corners\n", getCorners(argv[1])); 
} 


int getCorners(char* file) { 
    FILE* input = fopen(file, "r"); 

    .. do soemthing interesting ... 


    return cornerCount; 
} 
+0

哦,我明白了!这也可能工作! :) 非常感谢! –

+1

“这也可能工作!”。只有这样才能工作:) – fayyazkl

0

,如果你有,所以你必须知道的argv不是一个全局变量在此线

*input = fopen(argv[1], "r"); 

get_corners()作用下。它是由main()功能看到一个变量只

也必须通过

input = fopen(argv[1], "r"); 

解决这一行

*input = fopen(argv[1], "r"); 

,并把它directely的main()作用下才能看到的argv参数

0

如果需要get_corners()需要FILE *,那么您只需要打开在main()的文件,其中argv是可用的,并将得到的指针传递给函数:

int main(int argc, char *argv[]) 
{ 
    if(argc > 1) 
    { 
    FILE *input = fopen(argv[1], "r"); 
    if(input != NULL) 
    { 
     const int corners = get_corners(input); 
     fclose(input); 
     /* Do something with corners here ... */ 
    } 
    } 

    return EXIT_SUCCESS; 
}