2011-05-12 4 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로 컴파일하기
+1

dlev는 이미 코드에 무엇이 잘못되었는지 알아 냈습니다. 당신은 우리에게 전체 발췌를 보여주지 않았으므로 조금 추측해야했습니다. gcc가 여기 당신을 도왔을 수도 있습니다. 경고를 사용하여 컴파일하십시오. IMO라는 훌륭한 옵션은'''gcc -Wall -pedantic''입니다. –

+0

@Heath Hunnicutt - 그래, 그것들은 최소한의 실질적인 옵션 인 것 같다. –

+0

@Heath : gcc 플래그'-std = c89' (또는 현재는 -ansi') 또는'-std = c99' (기본적으로 -pedantic을 사용하여) 활성화 된 gnu-isms를 막기 위해 – pmg

답변

5

내가 코드를 컴파일 놀랐어요에으로 gcc4로 컴파일

. 이전에 선언 한 경우 if/else 블록의 할당 앞에있는 FILE* 텍스트를 제거하십시오.

+1

내 생각에 gcc는 다른 사람이 스스로를 쏠 수있는 더 많은 기능을 추가했다. 발을 더 쉽게. – BMitch

+3

+1 OP는 이미 외부 범위에서'''FILE * pFile'''을 정의하고 코드를 보여주지 않아야합니다.OP가'''pFile''에 할당 할 때마다 OP는''FILE *''을 쓰고있는 것으로 보입니다. –

+0

허, 언어 구조 내에서 변수를 선언 할 수 없다는 것을 몰랐습니다. 고마워요. –

0

if 문 내에 pFile을 정의하지 않으면 범위를 잃게됩니다.

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

내가 포함시키지 않은 코드에 이전에 FILE * pfile;이있을 것입니다. 그것이 모든 블록 밖에 있고 정적 저장 기간을 가지고 있다면 NULL로 초기화됩니다.

그러면 내부 블록에 FILE * pfile = fopen(...이있을 때 두 개의 pfile은 서로 다른 두 가지입니다. 따라서 어떤 일이 벌어지고있는 것입니까?

블록에 pfile을 정의하고 있습니다. 그런 다음 블록의 끝까지 도달하면 블록의 다른 변수와 마찬가지로 무시됩니다.

원래 열어 본 것이 없거나 아무것도 할당하지 않은 원래 pfile으로 남았습니다. 그럴 가능성이 있습니다.

두 번째 경우에는 파일을 열고 삭제 한 다음 if 테스트 문과 동일한 범위에 FILE * pfile 문구가 있습니다. 테스트 한 내용이므로 괜찮습니다.

pfile을 추가로 정의하면 컴파일러 오류가 발생하거나 별도의 버전을 제공하기 때문에 수행해야 할 작업은 한 번뿐입니다. 내부 블록에서 FILE *을 모두 가져 와서 항상 동일한 pfile을 사용하십시오.

관련 문제