2009-12-11 224 views
6

在我的C程序中,這個函數將處理打開特定文件的所有工作,然後返回文件指針,所以主函數或其他函數可以通過使用fp讀取內容,但到目前爲止,我一直沒有能夠得到這個工作。函數返回指針C

我只是在學習語言,所以有可能我做的事情非常錯誤。

int open_text_file(char text_file_name[]) 
{ 
    FILE *fp; 

    if((fp = fopen(text_file_name, "r")) != 0) 
    { 
      return fp; 
    } 

    else 
    { 
      printf("Cannot open file \"%s\"\n", text_file_name); 
    } 
} 
+1

你試圖返回一個指向'FILE'結構的指針作爲'int'。你看到什麼(除了那個錯誤)? – 2009-12-11 21:54:00

+1

作爲編碼風格問題,您應該將'fp'與'NULL'而不是'0'進行比較。如果也可能更清楚地將賦值和「fp」的比較分離爲單獨的語句。 – 2009-12-11 21:55:46

回答

11

在第一行,你有

int open_text_file(char text_file_name[]) 

此聲明的返回類型爲int 你應該有什麼是

FILE * open_text_file(char text_file_name[]) 

同樣,在你的 「別人」的情況下,您應該返回一些信息來向調用者指示 錯誤。

return NULL 

是一個合適的選擇。儘管如此,確保你在調用它時檢查你的返回值。

+0

完美,現在我能夠通過argv [1]到該函數並從main打印內容。 如你們許多人所說,我應該比較fp到NULL,爲什麼? – KJ0090 2009-12-11 22:13:49

+0

在一些不常見的平臺上,NULL可能不是0.但是,在C++中並不是這樣,或者在實踐中大多數地方都是如此。 – McPherrinM 2009-12-11 22:21:39

0

FILE* open_text_file();需要成爲原型。

int不是FILE*

6

該函數有點沒有意義,因爲它所做的只是fopen()所做的事情以及錯誤消息。這是不好的設計,因爲錯誤分支也必須返回一個(可能爲NULL)指針,然後必須在調用代碼中再次測試它。更好的是簡單地說:

FILE * fp = fopen(somefile, "r"); 
if (fp == NULL) { 
    fprintf(stderr, "Cannot open %s\n", somefile); 
    exit(1); // or whatever you need to do to handle the error 
} 
+0

+1,這個功能真的沒有意義。 – 2009-12-12 18:59:54