2016-08-09 8 views
-1

그래서,이 지금까지 저를 귀찮게하는 장이다 예외 : 액세스 위반 읽기 위치

void CNCread(fPointer){ 
    printf("\n"); 
    fPointer = fopen ("CNCG.txt", "r"); 
    char line[30]; 
    while(!feof(fPointer)){ 
     fgets(line, 150, fPointer); 
     puts(line); 
    } 
    fclose (fPointer); 
    return; 
} 

내가 얻을, 컴파일 실행하고 실행 한 후 다음과 같은 오류 이 함수는 다음과 같습니다.

Parser.exe의 0x00007FFCA1DEEAC5 (ntdll.dll)에서 예외가 throw되었습니다. 0xC0000005 : 0xFFFFFFFFFFFFFFFF 위치에서 액세스 위반이 발생했습니다.

방금이 프로젝트를 Code :: Blocks에서 Visual Studio 2015로 변환하고 legacy_stdio_definitions.lib 등을 추가 했으므로 문제는 아니지만 code :: code와 함께 잘 작동합니다. 미리 감사드립니다.

+0

'문자 라인 [30]'-'는 fgets (라인 150은 ...'- 5 파운드 가방에 감자 10 파운드 물건 시도 – PaulMcKenzie

+0

명백한 오류가 당신의 문자 배열이 있다는 것입니다? 너무 작고 라인이 30 자 이상이지만 정의되지 않은 동작을 일으킬 수 있지만 다른 문제가있을 수 있으므로 [mcve]를 게시하십시오. 또한 Visual Studio를 사용하여이 실제 코드를 컴파일했다고 확신하지 않습니다 - VS 2015'C '컴파일러는 여전히 C89/90 표준이며, 함수 블록의 중간에 변수를 선언 할 수 없습니다. – PaulMcKenzie

+0

@PaulMcKenzie : 사실이 아닙니다 .VS는 오랫동안 C89였으며 이제는 C99 하지만 tgmath.h와 복합체. 예, 코드와 혼합 된 선언이 포함되어 있습니다. – librik

답변

0

먼저 char line[30]은 최대 30 char 초를 포함 할 수 있지만 fgets(line, 150, fPointer);을 통해 그 이상을 쓰려고합니다.

또한 fopen이 성공했는지 또는 실패했는지 확인하지 않았습니다. 그리고 fgets이 성공했는지 또는 실패했는지 확인해야합니다.

또한 funciton 매개 변수로 사용하지 않고 fPointer을 함수 내에 선언 할 수 있습니다. 유형은 FILE *이어야합니다.

void CNCread(/* fPointer */){ 
    printf("\n"); 
    FILE *fPointer = fopen ("CNCG.txt", "r"); 

    /* Check if fopen succeded */ 
    if (fPointer == NULL) { 
     fprintf(stderr, "Error: Cannot open file to read\n"); 
     /* Some code */ 
     return; 
    } 

    char line[30]; 
    while(!feof(fPointer)){ 
     /* You are writing more chars to line than its capacity */ 
     /* fgets(line, 150, fPointer); */ 
     /* Change it to write at max 30 chars to line */ 
     if (fgets(line, 30, fPointer) != NULL) 
      puts(line); 
    } 
    if (fclose(fPointer) == EOF) { 
     fprintf(stderr, "Error: Cannot close the file after reading\n"); 
     /* Some code */ 
     return; 
    } 

    return; 
} 
+0

이 코드에서 많은 오류가 발생합니다. 메신저 일부를 포함 실종, 내가 stdio.h stdlib.h, string.h 이상 아무것도 추가해야한다고 믿습니다; NULL, EOF 그리고 stderr이 에러를 준다. – Ata

+0

'stdio.h'는이 함수에 필요한 모든 것이다. 그러나 이전에는 코드에서 실수가있었습니다. 나는 그들을 바로 잡았다. 지금 확인해 주시겠습니까? – sps

+0

코드에서 여전히 오류가 발생하지만 몇 가지를 변경했습니다. 여전히 vs를 사용하는 동안 제목에서 오류가 발생하지만 내 .exe에서는 정상적으로 작동합니다. 따라서이 문제는 저에게 딱 맞는 것입니다. 감사! – Ata