[get_next_line] get_next_line에 대해 알아보자.

채명석·2021년 4월 10일
0

42Seoul

목록 보기
10/45

1. GNL! 뭘 해야하는 걸까??

우선 subject를 읽어보도록 합시다.

  • get_next_line 함수를 반복문 안에서 호출하면 파일 디스크립터에서 사용할 수 있는 텍스트를 EOF가 올때까지 한 번에 한 줄씩 읽을 수 있을 것입니다.
  • 파일에서 읽을 때 그리고 표준입력으로부터 읽어드릴 때, 함수가 제대로 동작하는지 확인하십시오.
  • libft는 이 프로젝트에서 사용할 수 없습니다. get_next_line이 동작하는 데 필요한 함수들이 들어있는 get_next_line_utils.c 파일을 추가해야 합니다.
  • 당신의 프로그램은 -D BUFFER_SIZE=xx 플래그를 붙여서 컴파일 해야 합니다. 그것은 여러분의 get_next_line에서 read함수를 호출하기 위한 buffer size로 사용될 것입니다.
    컴파일은 이런 식으로 진행됩니다 : gcc -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c
  • 여러분의 read 함수는 표준입력으로 또는 파일로부터 읽어드리기 위해서 컴파일할 때 정의된 BUFFER_SIZE를 사용해야 합니다.
  • get_next_line.h (헤더 파일)에는 적어도 get_next_line 함수의 프로토타입이 있어야 합니다.

간단하게 정리하자면 gnl함수 한번 호출하는데 한 줄씩 읽어서 파일의 끝까지 읽을 수 있어야 하고 표준입력으로도 동작해야한다는 말인데 우선 여기에서 알아둬야 할 부분들은 컴파일옵션 -D, 파일디스크립터정도 일 것 같습니다.

-D는 컴파일할 때 뒤에 오는 내용을 define해줍니다. 즉 #define BUFFER_SIZE 32와 동일하게 작동하게 만들어준다는 말이죠.

일단은 뒤로 미뤄두고 gnl에서 가장 중요한 것은 저런게 아니라 정적변수, 즉 static에 대해서 알아야 합니다.
그렇지 않으면....과제 못 해요.....

다음으로 넘어가 봅시다.

  • BUFFER_SIZE 값이 9999인 경우에도 함수는 여전히 작동하나요? BUFFER_SIZE 값이 1이라면? 10000000이라면? 왜 그런지 아시나요?
    • BUFFER_SIZE가 엄청 클때 즉, read함수로 읽어들일 때 한번에 엄청 많은 양을 읽어들일 수 있는지 물어봅니다. 이 부분은 어떤 방법으로 구현을 하느냐에 따라서 읽어들일 수 있는 양이 달라집니다. 그렇기에 왜 되는지, 왜 안되는지를 알아두고 넘어가면 될 것 같습니다.
  • get_next_line이 호출될 때마다 가능한 한 적게 읽도록 해야 합니다. 만약 newline을 만나면, 현재라인을 반환해야 합니다. 전체 파일을 읽은 다음에 한줄씩 처리하려고 하지 마세요.
    • 꼼수는 안된다는 말씀..
  • 테스트하지 않고 프로젝트를 제출하지 마세요. 돌려볼 테스트는 많아요. 생각해볼 수 있는 모든 문제상황을 고려하세요. 파일로부터, redirection으로부터, stdin으로부터의 읽기를 시도하세요. 표준 출력에 newline을 보낼 때 프로그램은 어떻게 동작하나요? , CTRL-D?
    • 테스트프로그램은 많은 분들이 올려주셨습니다. 그거만 통과해도 충분합니다! 그리고 CTRL-D를 사용해서 표준입력을 사용해보라고 하네요.
  • 만약 동일한 파일 디스크립터의 두 호출 사이에서 첫 번째 fd에서 EOF에 도달하기 전에 다른 파일로 전환될 경우, 우리는 get_next_line이 정의되지 않은 동작을 가진다고 생각합니다.
    • 이 부분은 보너스로 할 수 있습니다.
  • lseek은 허용된 함수가 아닙니다. 파일 읽기는 오로지 한번만 행해져야합니다.
    • 현재 읽어들이고 있는 부분을 바꿀수 있는 함수를 쓰지 말라고 합니다. 그러면 우리는 한번 읽으면 뒤로 돌아갈 수 없이 계속 앞으로 나가면서 읽어야 하죠.
  • 마지막으로 바이너리 파일을 읽을 때, 우리는 get_next_line이 정의되지 않은 동작을 가진다고 생각합니다. 그러나 여러분이 원한다면, 이러한 동작을 논리적으로 만들 수 있습니다.
  • 전역 변수는 금지되어 있습니다.

서브젝트만 읽어봐도 복잡하지만 GNL은 어떻게 해야하는지만 알면 금방 할 수 있는 과제입니다. 그렇게 어렵지 않아요!
서브젝트를 잘 읽어보고 이제 과제를 시작해 보도록 합시다!

[get_next_line] get_next_line에 대해 알아보자.
[get_next_line] 파일디스크립터에 대해 알아보자
[get_next_line] 정적변수, static variable에 대해 알아보자
[get_next_line] get_next_line! 어떤 식으로 구현해야할까?

0개의 댓글