c언어 파일을 읽어서 배열에 저장을 하려 하는데 Segmentation Fault가 뜹니다.

조회수 761회

void add_words()을 이용해서 여러 줄의 문자열로 이뤄진 파일인 words.dat을 읽는 코드를 작성했는데 리눅스에서 실행을 시켜보니 segementation fault가 뜹니다.

fopen에 대해서는 지식이 없어 오류가 발생한 이유를 잘 모르겠어서 질문드립니다.

감사합니다.

참고:words.dat의 내용입니다.

  • File "words.dat" from the Stanford GraphBase (C) 1993 Stanford University
  • A database of English five-letter words
  • This file may be freely copied but please do not change it in any way!
  • (Checksum parameters 5757,526296596)
aargh
abaca 2
abaci+1
aback*2,2,3
.
.
.
.
.
.
zooey
zooks
zooms*3,1
zowie 4
  • End of file "words.dat"

아래는 코드입니다.

void add_words() //words.dat을 입력받는 함수이다.
{


    char p[5762][5]; //진짜 최종 저장 공간
    char *name;
    char test[1]; //첫번째 문자가 *인지 아닌지를 테스트 하는 문자열
    int i = 0;
    FILE* fp=NULL;

    int f = 0;
    fp = fopen("words.dat", "r");
    if (fp == NULL) //파일이 비어 있으면 긴급 탈출.
    {
        fprintf(stderr, "File Open Error!\n");
        exit(1);
    }

    for (i = 0; i < 5762; i++) //5줄의 문자를 읽어옴.
    {

        name = (char*)malloc(sizeof(char) * MAX);
        fgets(name, MAX, fp);


        test[0] = name[0];

        if (test[0] == '*')  //만약 첫번째 문자가 *이라면
        {
            goto Skip;
        } //그냥 건너뛴다.
        else {


            for (f = 0; f < 5; f++)
            {
                p[i][f] = name[f]; //최종 배열은 p이다.
            }
        }






    Skip:



        //배열 n[]에 모든 데이터들이 저장되어 있을 것이다.

        ;

    }
    fclose(fp);
    return ;
}

1 답변

  • 아래 코드 참고하세요.

    • 코드
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        FILE* fp = fopen("words.dat", "r");
        if (fp == NULL) {
            fputs("파일 열기 오류\n", stderr);
            return 1;
        }
    
        // 메모리 확보
        char* p_word_list[5757] = { 0 };
        for (int i = 0; i < 5757; ++i)
            p_word_list[i] = malloc(sizeof(char) * 6); // 5글자 + 널문자 공간 1 = 6
    
        // 파일 읽기
        for (int i = 0; i < 5757; ++i)
            fscanf(fp, "%s", p_word_list[i]);
    
        // 테스트 출력
        for (int i = 0; i < 10; ++i)
            printf("%d: %s\n", i, p_word_list[i]);
    
        for (int i = 5747; i < 5757; ++i)
            printf("%d: %s\n", i, p_word_list[i]);
    
        // 메모리 해제
        for (int i = 0; i < 5757; ++i)
            if (p_word_list[i]) free(p_word_list[i]);
    
        return 0;
    }
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)