2010-02-18 4 views
0

무엇이 문제 일 수 있습니까?왜이 코드로 세분화 오류가 발생합니까?

#include <stdio.h> 
#include <string.h> 
#define SIZE 19 

void filePrint(char fileName[]); 

int main (void) 
{ 
    char fileRead[SIZE]; 

    filePrint(fileRead); 

    return 0; 
} 

void filePrint(char fileName[]) 
{ 
    FILE *inp; 
    int input_status = 0; 
    char readFile[SIZE]; 

    inp = fopen(fileName, "r"); 

    printf("\nEnter a file to print:\n"); 

    input_status = fscanf(inp, "%s", readFile); 

    while (input_status != EOF) 
    { 
     printf("%s\n", readFile); 
     input_status = fscanf(inp, "%s", readFile); 
    } 

    fclose(inp); 
} 
+2

같은 문제를 일으키는 게시하는 코드의 양을 최소화 할 수 있다면 더 많은 정보를 얻고 더 좋은 답변을 얻을 수 있습니다. 모든 코드를 덤프하고 "내 문제 해결"이라고 말하면 코드를 수정하는 데 큰 동기가 없지만 작은 샘플을 게시하고 "왜 내가 예상했던대로 작동하지 않습니까?"라고 말하면됩니다. 우리는 일반적으로 당신에게 설명 드리겠습니다. –

답변

3

다른 것들 중에서도 실제로 읽을 파일을 지정하지 않으셨습니까?

+3

실제로, 세그 폴트는 파일 핸들에서 읽으려고 할 때 발생합니다. 파일 핸들은 'NULL'포인터를 역 참조합니다. 하지만 포인터는 당신이 진술 한 이유 때문에'NULL'입니다, 그래서 pedantic 대신에 도움이되는 +1. –

+0

'fileRead'에 NUL 문자가 포함되지 않으면'fopen()'이 반환되기 전에 segfault가 발생할 수 있습니다. – bk1e

1

fopen()에 준 filePrint()에 입력하기 전에 main에 fileRead []를 넣지 않은 것처럼 보입니다. 즉, "초기화되지 않은 데이터"

7

나는 다시 가서 File I/O에 관한 장을 읽어야한다고 생각한다.

마음에 쓴 코드를 실행하고 큰소리로 말하십시오.

fileName 문자열에 저장된 파일을 열려고하지만 해당 문자열이 유효한 모든 것으로 초기화되지 않았습니다 (fopen). fopen은 파일을 열 수 없으면 NULL 포인터를 반환합니다. 이 NULL 포인터를 사용하여 읽을 수는 없습니다. 방금 ​​연 파일에서 fscanf를 사용하여 읽는 경우 사용자는 아무 것도 입력 할 수 없습니다.

2

fopen(fileName, "r");으로 전화 할 때 fileName은 파일 이름으로 채워지지 않았습니다. 그것은 초기화되지 않은 배열입니다.

+0

감사합니다 ... 나는 그것을 알아 냈습니다 – Tomi

+0

이 바로 대답이 아닌가요? – Craig

1

fileRead [] 배열의 파일 이름도 언급 한 경우 세그멘테이션 오류가 발생합니다. 배열 크기를 19로 지정 했으므로 1024와 같이 fileRead [] 배열에 큰 배열 크기를 지정해야합니다.

1

함수의 파일 이름을 지정해야합니다.

값없이 문자 배열을 전달합니다. 따라서 그 배열의 값은 null입니다. fopen 함수에서 파일을 열려고 시도합니다.

그래서 fopen 함수는 null 값을 반환합니다. fopen 함수가 파일을 성공적으로 열면 올바른 파일 포인터를 반환합니다. 그렇지 않으면 널을 리턴 할 것이다. 에러는 errno에 저장 될 것이다.

널 포인터를 사용하면 읽을 수 없습니다.

관련 문제