2013-09-25 106 views
2

我正在通過編程項目來學習我正在學習的課程,我正在努力解決我認爲對C編程的根本誤解,並希望能夠提供幫助。我試圖打開一個文件,這段代碼:打開並解析文件

FILE *fp; 
if(fp = fopen("testfile.txt", "r") == NULL){ 
    perror("fileopen"); 
} 

當我嘗試編譯的代碼,我得到這樣的警告: 警告:賦值時指針從整數沒有投

然後,當我嘗試閱讀文件時,我遇到了分段錯誤。

我是一名經驗豐富的java程序員,但在C中有一些關於指針和數據類型的東西,我只是不明白。

謝謝!

+0

周圍添加(FP = fopen()函數)== NULL位 – Neil

+0

旁註額外的支架:建議用「rt」打開文本文件進行閱讀。 – chux

回答

1

問題在於操作符優先級的誤解。 fopen("testfile.txt", "r") == NULL首先被評估,並且結果(1或0)被存儲在指針fp中,而不是從fopen("testfile.txt", "r")的實際返回值。

您應該在if語句中實際使用(fp = fopen("testfile.txt", "r")) == NULL。或者,如果你是剛開始,它可能是更好的打破這一點,並寫上:

FILE *fp = fopen("testfile.txt", "r"); 
if(fp == NULL){ 
    perror("fileopen"); 
} 
1

你錯過一對括號的:

(fp = fopen("testfile.txt", "r") == NULL) 

被解析爲

(fp = (fopen("testfile.txt", "r") == NULL)) 

它評估比較,給出一個int,然後存儲在一個指針值變量,因此警告。

應該

((fp = fopen("testfile.txt", "r")) == NULL) 
2

其他人指出,出問題的if。爲了避免這種情況,請將事情分開。這將是更具可讀性和容易出錯少:

FILE *fp; 
fp = fopen("testfile.txt", "r"); 
if(fp == NULL) { 
    perror("fileopen"); 
} 

或者,你看到了很多:

FILE *fp; 
fp = fopen("testfile.txt", "r"); 
if(!fp) { 
    perror("fileopen"); 
}