2013-03-05 2 views
1

전역 파일 포인터 선언에 문제가 있습니다. 결과적으로 세분화 오류가 발생합니다. GDB는 특별히 sourceToStream 함수의 fscanf 행에서 발생한다는 것을 보여주었습니다. 어떤 도움을 주시면 감사하겠습니다.C의 전역 파일 포인터 선언

#define SOURCE_CODE "source_code.txt"   
#define CHARACTER_STREAM "character_stream.txt" 

static FILE* in_fp; 
static FILE* out_fp; 

void sourceToStream() { 
    char buf; 

    while(fscanf(in_fp, "%c", &buf) != EOF) { 
     if (buf == '\%') 
      while(buf!='\n' && buf !='\r' && buf!=EOF) 
       fscanf(in_fp, "%c", &buf); 

     if(buf != '\n' && buf != '\r' && buf != '\t' && buf != ' ') 
      fprintf(out_fp, "%c", buf); 
    } 
} 

int main() { 

    in_fp = fopen(SOURCE_CODE, "r"); 
    out_fp = fopen(CHARACTER_STREAM, "w"); 

    sourceToStream(); 

    fclose(in_fp); 
    fclose(out_fp); 

    return 0; 
} 
+2

이'는 fopen()'성공 하는가 해당 파일 또는 디렉터리를? – hmjd

+1

Mike가 그의 코멘트를 삭제 한 이유는 모르지만'fopen'의 반환 값을 확인하지 않으시겠습니까? – Shahbaz

+0

두 개의 'fscanf'가 있습니다. – md5

답변

2

GDB $ 1 = (파일 *)이 0x0 in_fp
(GDB) p) (제 fopen을 실행 후 다음과 같은 출력을 제공 0x0 주소에서 메모리를 액세스 할 수
(GDB) p의 *의 in_fp

즉, 파일이 올바르게 열리지 않았거나 더 구체적으로 source_code.txt가 열리지 않았다는 의미입니다.

open 명령에 경로를 포함하지 않았으므로 현재 작업 디렉토리 (바이너리를 실행중인 디렉토리)에 있는지 확인하고 읽기/쓰기 권한이 있는지 확인하십시오. fopen()를 들어

결과 파일 핸들이 다음 오류 메시지가 NULL 인쇄되는 경우가 있다면 당신이 확인할 수 있습니다

in_fp = fopen(SOURCE_CODE, "r"); 
    if(in_fp == NULL) { 
     perror("Failed to open the source"); 
     return EXIT_FAILURE; 
    } 

예를 들어, 파일이 당신이 좋아하는 무언가를 얻을 수 있습니다 존재하지 않는 경우 :

소스를 열지 못했습니다 없습니다

:

+1

사실, 열린 파일은 현재 작업 디렉토리에 있어야하며 코드가 앉아있는 디렉토리와 반드시 일치하지는 않습니다. 그렇지 않으면 +1. – bitmask

+0

@bitmask - 좋은 점은 소스, 바이너리 및 텍스트가 모두 같은 위치에 덤핑되었다고 가정했으나 반드시 그럴 필요는 없습니다. 업데이트 됨. – Mike

+0

C 함수에 대해 cplusplus.com을 참조하는 이유는 무엇입니까? cplusplus.com은 일반적으로 부정확 한 정보로 가득 찬 것으로 간주되므로 어쨌든 피해야합니다. – Shahbaz