2012-11-02 70 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; 
}