2011-05-12 103 views
2

對,我有這樣的代碼:fopen返回NULL,但perror打印成功?

if(argc>1){ 
      FILE * pFile = fopen(argv[1],"rb"); 
      perror(""); 
}else{ 
     FILE * pFile = fopen("hardcoded","rb"); 
} 
if(pFile==NULL){ 
       puts("Unable to open source file"); 
       return -1; 
} 

不過,我得到這個奇怪的輸出:

Success 
Unable to open source file 

Weirdlier,如果我這樣做:

if(argc>1){ 
      FILE * pFile = fopen(argv[1],"rb"); 
      perror(""); 
}else{ 
     FILE * pFile = fopen("hardcoded","rb"); 
} 
FILE * pFile = fopen("hardcoded","rb"); 
if(pFile==NULL){ 
       puts("Unable to open source file"); 
       return -1; 
} 

如果硬編碼存在,它一切正常!

什麼大火意思呢?

與GCC4在Ubuntu

+1

dlev已經知道你的代碼有什麼問題。你沒有向我們展示整個片段,所以我們不得不猜測一點。海灣合作委員會可以幫助你在這裏。編譯啓用警告。一組不錯的選項,IMO,就是'''gcc -Wall -pedantic'''。 – 2011-05-12 18:23:48

+0

@Heath Hunnicutt - 是的,那些似乎是最小的實際選項 – 2011-05-12 18:38:00

+0

@Heath:更妙的是增加了GCC標誌'-std = c89'(或相當於當前'-ansi')或'-std = c99'以防止缺省情況下啓用的gnu-isms(即使帶有pedantic) – pmg 2011-05-12 18:42:42

回答

5

我很驚訝,你的代碼編譯編譯,因爲您聲明FILE *pFile作用域是,如果和別的塊。如果您在此之前聲明瞭它,請在if/else塊中的賦值前面刪除FILE*文本。

+1

我的猜測是'gcc'增加了更多的功能,腳更容易。 – BMitch 2011-05-12 18:22:02

+3

+1 OP必須已經在外部範圍定義了''FILE * pFile'',並且不向我們顯示該代碼。每次OP分配給「pFile」時,似乎OP都在寫'''FILE *''''。 – 2011-05-12 18:22:49

+0

呵呵,不知道你不能在語言結構中聲明變量。感謝所有:) – 2011-05-12 18:30:47

0

不要if語句中定義PFILE,你失去範圍。

FILE * pFile; 
if(argc>1){ 
      pFile = fopen(argv[1],"rb"); 
      perror(""); 
} 
0

我敢打賭,你已經有了前面代碼中的FILE * pfile;,你沒有包括。如果它在所有塊之外,並且具有靜態存儲持續時間,則它被初始化爲NULL。

當你在內部塊中有FILE * pfile = fopen(...時,兩個pfile是兩個不同的東西。因此,發生了什麼:

你在一個塊定義pfile,打開它的罰款。然後到達塊的末尾,並像塊中的任何其他本地變量一樣被丟棄。

你留下了原pfile,你從來沒有打開或分配的任何東西,這很可能是NULL。

在第二種情況下,你打開一個文件,然後將其丟棄,然後你在同一範圍內測試if語句FILE * pfile,這就是你正在測試的一個,所以它的罰款。

你需要做的是定義pfile只有一次,因爲額外的定義要麼原因編譯器錯誤或給你不同的版本。將所有FILE *從您的內部塊中取出,並且始終使用相同的pfile