2017-02-10 3 views
-2

업데이트 된 코드 완전한 기능을 파일 ***분할 오류가

내가 C/C에 새로 온 ++ 나는 프로그램이 '작성하여 실행 된 횟수를 계산 할 코드의 조각을 썼다에 기록 할 때 count '를 매번 파일에 추가합니다. 그것을 실행하려고하면 seg 오류 오류가 발생하는 것을 제외하고는. 누구나 왜 그런지 말할 수 있니?

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, const char * argv[]) { 
    FILE *fp; 
    printf("LINE 13 CLEAR"); 
    fp = fopen("MyPlayground.rtf", "r"); 
    int value; 
    fscanf(fp, "%d", &value); 
    printf("Value is %d", value); 
    //printf("LINE 14 CLEAR"); 
    if(fp== NULL) 
    { 
     printf("LINE 17 CLEAR"); 
     if(fopen("MyPlayground.rtf", "w")==NULL) 
     { 
      exit(0); 
     } 
     //fprintf(fp,"%d",0); 
     fclose(fp); 
     return 0; 
    } 
    //printf("LINE 25 CLEAR"); 
    fp = fopen("MyPlayground.rtf", "w"); 
    //printf("LINE 30 CLEAR"); 
    fprintf(fp,"%d",++value); 
    fclose(fp); 
} 

EDIT : "printf ("LINE 17 CLEAR ");"까지 프로그램이 실행됩니다. 그 다음에 다음 줄에 'EXC-BAD-ACCESS'오류가 표시됩니다.

EDIT1가 : 두 번째 fopen(...) 문에 대한 추가 에러 체크 :

EDIT2 두 개의 서로 다른 경로를 고정 수정되었습니다.

또한 스타일 오류와 내가해야하거나하지 말아야 할 것에 대해 자유롭게 의견을 말하십시오. 감사.

+0

반환 값을 검사하여 fopen 및 fscanf 호출이 모두 작동하는지 확인하십시오. –

+0

'/ Desktop/hw3 /'디렉토리에 쓰기 권한이 있는지 확인하십시오. – Shravan40

+0

시스템 디버거를 익히고 나머지 평생 동안 디버그 명령문을 작성하는 데 소요되는 시간과 시간을 절약하려면 30 분이 소요됩니다. 당신은 실제로 브레이크 포인트를 설정하고 지우고, 함수로 들어가서 변수를 출력하는 방법을 알 필요가 있습니다 ... –

답변

3

나는 당신이 그것을 처음으로 실행했을 때만 내기합니다. 그 이유는 다음과 같습니다. 11 :

11 fprintf (fp, 0);

기본적으로 fprintf에 널 포인터를 전달합니다. 아마도 의도 한 것은 다음과 같습니다.

11 fprintf (fp, "0");

내가 알아 낸 방법은 다음과 같습니다. 나는 디버그 정보로 컴파일하고 정확히 말하면, 디버거 ... lldb를 사용하여 실행 :

BT (lldb) * 스레드 # 1 : TID = 0xacaaf, 0x00007fff90f4dcf6 __vfprintf + 327

frame #1: 0x00007fff90f762e7 libsystem_c.dylib`__v2printf + 471 

frame #2: 0x00007fff90f766bc libsystem_c.dylib`__xvprintf + 633 

frame #3: 0x00007fff90f4db36 libsystem_c.dylib`vfprintf_l + 54 

frame #4: 0x00007fff90f4669b libsystem_c.dylib`fprintf + 186 

frame #5: 0x0000000100000e9d test.out`main(argc=1, 
__vfprintf + 327, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) * frame #0: 0x00007fff90f4dcf6 libsystem_c.dylib libsystem_c.dylib

ARGV = 0x00007fff5fbffc60) TEST.C에서 + 109 11 프레임 # 6 : 코드 0x00007fff8f9c95fd libdyld.dylib`start + 1

...가 프레임 (5)를 보면, 사용자가 볼 일으키는 라인 .

+0

fprintf가 널 포인터를 전달하지 않습니다. 'fp = fopen ("/ Desktop/hw3/hw3/MyPlayground.txt", "w");'이 디렉토리에 그 이름을 가진 파일을 찾지 못한다.그래서 나는 왜 그것이 그 성명 이후에 null이 될지 모르겠다. –

+0

@MarcoNeves 그는'fp'가 null이라는 것을 말하지 않고 두 번째 매개 변수를 의미했습니다. –

+0

오, 알기 때문에'fprintf (fp, "% d", 0);'를하면 기술적으로 고칠 것입니다. –