[Get Next Line] 코드 구현

Soeng_dev·2021년 1월 29일
0

42 Seoul / Get_next_line

목록 보기
2/3

• Mandatory

» 사용한 함수 및 헤더

» 메인 로직

위 get_next_line.c의 전체적인 로직은 다음과 같다.

  1. 잘못된 fd, line, BUFFER_SIZE에 대한 에러처리

  2. get_oneline_and_next함수에서
    read로 문자열을 buffer에읽어오고,
    읽어들인 문자열중 한 줄만큼을 포인터 temp에 동적할당 하고,
    다음줄의 첫원소의 주소를 스태틱 포인터 next에 할당한다.

  3. get_oneline_and_next에서 ERROR가 발생했다면 (read실패, malloc실패) ERROR를 리턴(-1을 리턴)

  4. 포인터 temp에 동적할당한 한줄의 문자열 주소를 *line에 할당

    굳이 temp 포인터에 할당 후 *line = temp로 할당해준 이유는,
    테스터기에 따라 들어온 *line 을 free해준 후 *line = NULL로의 초기화 여부가 테스터기마다 달라서, 발생하는 에러를 피하기 위함이다.

  5. get_one_line_and_next가 파일을 끝까지 읽었다면, 즉, read가 파일의 끝까지 읽었다면 END를 리턴(0을 리턴),
    END, ERROR 모두 아니라면 SUCCESS를 리턴(1을 리턴)

» get_oneline_and_next 함수

사실상 내가 구현한 gnl의 메인 부분이다.
위의 get_next_line.c 코드는 대부분이 에러케이스 처리, 리턴처리, 변수 초기화 등이기 때문이다.
원래는 get_oneline_and_next 함수에 해당하는 while문 부분이 get_next_line.c에 있었지만, norminette 코드 라인수 제한을 맞추느라 하나의 함수로 만들어 빼내었다.

위의 메인 로직 목차에서 설명한 바와 같이 이 함수가 하는 일은 다음과 같다.

  1. 한줄을 읽을때까지 read로 문자열을 읽어오고,

  2. 읽어들인 문자열을 한 줄이 될때까지(개행문자나 파일의 끝에 도달할때까지) 포인터 temp에 동적할당후 cat 하고
    (strcat_del : 문자열의 끝이나 delimiter(여기선 '\n')에 도달할때까지 cat한다)

  3. 한 줄이 된다면 다음줄의 첫원소의 주소를 스태틱 포인터 next에 할당하고 (*next = '\n' 일때 next += 1로 개행 다음에 오는 다음줄 첫원소에 할당)
    변수 is_oneline = 1로 할당해 while 반복문을 빠져나오게 한다.

• Bonus

» 사용한 함수 및 헤더

static 변수를 하나만 써야하므로, read로 읽은 문자열에서 개행문자 뒤의
다음 줄부터의 문자열을 memmove를 이용해 backup[fd]에 백업하기 위해 ft_memmove함수를 사용했다.

get_next_line_utils_bonus.c의 norminette 함수갯수 제한(5개)를 맞추기 위해 ft_strcpy를 삭제함.

» 메인 로직

Mandatory의 get_next_line.c와 전반적인 골자는 비슷하며 static변수를 하나만 사용하기 위해 temp 를 char* 포인터로 선언함

또한 buffer역할을 했던 static문자열 변수가 여기서는 개행문자 뒷부분의 문자열을 저장(backup)해줘야 한다.
좀더 직관적으로 변수 쓰임새를 알 수 있도록 backup으로 이름을 바꿔주고, Bonus 요구사항에 있는 multiple fd handling이 가능하도록 이차원 문자열로 선언했다.

Mandatory와 달리 static변수를 하나만 사용하므로
ft_memmove를 사용해 개행문자 뒤의 다음줄을 문자열 변수에 저장해야 한다.

» get_oneline_and_next 함수

Mandatory에선 next 가 static 변수이므로
next == NULL 조건을 이용해 read한 문자열을 끝까지 읽었거나, 함수를 처음 호출하는 상황을 인지했다.

Mandatory와 달리 next == NULL 조건문을 backup[0] == '\0' 조건문로 바꿔줬다.
backup은 static변수이므로 함수를 처음 호출하는 상황이 인지가능하기 때문이다.(함수 처음 호출시 초기값 지정안하면 static변수는 자동 0으로 초기화)

profile
Software Engineer

0개의 댓글