Search
Duplicate
🐷

개인적인 생각 (차후 정리 예정) by jseo

분류
visible
과제
get_next_line
생성일
2021/03/20 18:18
작성자
nj_blog
최종 편집일
2021/03/20 18:18
Property

Mandatory & Bonus

1.
libft 라이브러리 사용 안 됨
2.
gcc -Wall -Wextra -Werror 외에 -D (매크로 정의 옵션)을 이용하여 BUFFER_SIZE를 정할 수 있어야 함
→ BUFFER_SIZE 인자로 받지 않은 경우, 헤더의 BUFFER_SIZE 이용 (ifndef endif)
3.
컴파일 옵션으로 들어간 BUFFER_SIZE를 이용하여 입출력을 해야 함
4.
BUFFER_SIZE → 1, 9999, 10000000 에도 되는지?
→ static 변수 활용
5.
파일에서 개행 문자를 읽을 때마다 반환할 것 (파일 전체를 읽고 처리하지 말 것)
→ read로 BUFFER_SIZE만큼 읽어 가면서 확인
6.
파일로도 읽을 수 있어야하고, STDIN으로도 읽을 수 있어야 함
→ 주어진 fd를 모두 이용하면 됨 (동시에 처리를 위한 OPEN_MAX를 고려)
7.
lseek 함수는 이용하지 말 것
8.
바이너리 파일을 읽는 행위 금지 (가능하게 할 수는 있는 것 같음)
9.
전역 변수는 이용할 수 없음
10.
파일이 EOF를 만나기 전에 파일 디스크럽터가 다른 파일을 가리키도록 바꾸는 행위는 금지

처리 전반 생각

1.
파일을 main에서 열었다 가정하여 int fd와 char * line의 주소를 get_next_line에 넘김
→ gnl 함수는 int fd, char **line을 받게됨
2.
fd 값에 대한 검증 및 기타 검증 필요
→ fd는 0 미만 값인 경우, line의 주소가 존재하지 않는 경우, BUFFER_SIZE가 0 이하 값인 경우 (OPEN_MAX는 BUFFER_SIZE와 달리 입력을 직접 받지 않는 것으로 보여 검증을 할 필요 없어 보임) 에는 -1 리턴
3.
read로 fd에 해당하는 파일을 BUFFER_SIZE만큼 buf에 받았을 때 개행 검사
→ 이 때 read의 상태는 EOF를 만나는 0, 에러의 -1의 경우가 있음 (예외 처리 필요)
→ read 상태 뿐만 아니라 개행 처리후 남은 애들에 대한 처리가 가능하려면 처리 함수를 따로 만들어야 함
4.
반복문을 돌려서 BUFFER_SIZE만큼 입력을 받고, static 변수에 append...
→ 이러고 끝이 아니라 반복문 돌 때마다 append된 사항에 대해 개행이 있는지 static 변수 확인이 필요 (만일 개행이 있다면 해당 인덱스를 기록하여, static 변수에서부터 잘라서 line에 할당한 후 끝내면 됨)
5.
3번 사항에 대해서 gnl 함수 안의 길이가 너무 길어지면 read 상태가 잘 맞지 않는 것에 대해선 함수로 따로 빼서 처리 가능
→ 이 경우엔 리턴을 gnl의 리턴 값인 -1, 0, 1 중의 상태 값을 상황에 맞게 리턴하면 됨
6.
4번 사항에 대해서 개행이 있는지 확인하는 함수, 개행이 있다면 static 변수의 몇 번째 인덱스에 존재하는지 확인하는 함수, 잘라내어 line에 할당하는 함수가 필요한 것을 알 수 있다.
→ 개행이 있는지 확인하는 함수 (static 변수 인자 필요), 개행이 있을 시 static 변수의 몇 번째 인덱스에 존재하는지 확인하는 함수 (static 변수 인자 필요)에 대해서는 두 함수를 합칠 수 있음 (개행이 있는지 확인 후 있다면 해당 인덱스를 리턴해주는 식)
→ 개행이 있다면 잘라내어 line에 할당하는 함수의 경우 char **line, static 변수, 자를 인덱스를 넘기면 됨 (이 함수는 리턴이 없도록 void로 줘도 되겠지만, gnl에서 자르는 함수 호출 시 바로 리턴할 수 있도록 gnl 리턴 값인 상태 값 1을 리턴할 수 있는 int로 두는 것도 좋아보임)
7.
관련 util 함수들
→ static 변수에서 개행을 찾아 잘라낸 값에 대해서 strdup가 필요하고 (free 잘해주기), 5번 관련 read 상태 이상 값에서도 strdup로 빈 문자열을 리턴하도록 할 수 있음
→ read로 읽어낸 임시 값을 static 변수에 append를 위해 strappend가 있어야 함
→ strappend를 위해 strlcpy, strlen이 필요함

주의할 점

1.
각 상태에 대한 예외 처리 (read, fd)
2.
defensive style memory free

코드 짜면서 헷갈린 부분

buf 동적할당 해제 타이밍
→ gnl 함수 리턴 타이밍
개행 처리 경우의 수
1.
반복문 돌면서 개행 찾아서 split 하면서 리턴 → 반복문 내
2.
파일 이미 다 읽어서 반복문 돌지 않고 static 변수에 다 들어가 있는 경우 → 반복문 외
2-1 오류난 경우
2-2 이미 파일 끝인 경우
2-2-1 개행이 아직 존재하는 경우
2-2-2 개행이 존재하지 않는 경우
2-2-3 문자 자체가 존재하지 않는 경우
static 변수 strappend으로 Heap 할당 받는데, 해제 타이밍?
→ line에 static 변수 개행 이전 할당 후 무조건 해제
→ 개행 이후가 존재하는지 유무에 따라서 static 변수 공간 추가
strappend 부분 그대로 libft 것 갖다 썼는데 static 변수가 NULL 일 가능성이 있어 strappend이 제대로 작동하지 않을 수 있음
→ 이 부분 추후 수정 가능성 존재
→ s1, s2 둘 중 하나 없으면 NULL 리턴하던 것 수정
→ static 변수에 덮어 쓰기 때문에 static 변수가 들어오는 부분을 해제 하도록 수정