c언어 파일을 읽어서 배열에 저장을 하려 하는데 Segmentation Fault가 뜹니다.
조회수 764회
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; }
- 결과
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력