편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.11.21

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


    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 ;
    }
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2021.11.21

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


    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 ;
    

    }