+ fd에서 한 줄을 읽는 것은 너무나도 지루하다(tedious).
+ 파일 디스크립터로부터 읽혀진, 개행으로 끝나는 한 줄을 반환하는 함수를 만들자.
+ main이 되는 함수는 프로젝트의 이름을 딴 get_next_line
- 프로토타입 : char *get_next_line(int fd);
- 매개변수 : 읽어들일 파일의 디스크립터
- 반환값 : 1) 읽혀진 라인 - 한 줄이 제대로 읽혔을 때, 2) NULL - 읽을 라인이 더이상 없거나 에러 발생시.
- 파일 디스크립터로부터 한 줄을 읽고 반환하는 함수
+ get_next_line 함수를 반복문 안에서 호출하면 파일 디스크립터에 존재하는 텍스트를 EOF전까지 한 번에 한 줄씩 읽어 들일 수 있다.
+ 방금 읽어들인 문자열 한줄을 반환하되 더 이상 읽어들일 것이 없거나 에러가 발생하면 NULL을 반환한다.
+ -D BUFFER_SIZE=xx 플래그를 이용하여 컴파일 되어야 한다. 이 BUFFER_SIZE는 get_next_line에서 read함수를 호출하기 위한 buffer size로 사용된다.
- gcc -Wall -Wextra -Werror -D BUFFER_SIZE=42 <파일들>.c 과 같이 컴파일된다.
Q : BUFFER_SIZE 값이 9999인 경유에도 함수는 여전히 작동하나요? 이 값이 1이라면? 10000000이라면? 이유가 뭔가요?
Q : gnl이 호출될 때마다 가능한 적게 읽어들이도록 해야한다. 만약 newline을 만나면, 현재 라인을 반환하야한다. 전체파일을 읽어들인 다음에 한줄씩 처리하려 하지 마세요.
Q : 테스트하지 않고 프로젝트를 제출하지 마세요. 여러분의 함수를 위해 돌려볼 수 있는 테스트는 많습니다. 파일로부터, redirection으로부터, stdin으로부터의 읽기를 시도해 보세요. 표준 출력에 newline을 보낼 때 프로그램은 어떻게 동작하나요? CTRL-D는요?
+ 'lseek'은 허용되지 않는다. 파일 읽기는 오로지 한번만 행해져야 한다.
+ 만약 동일한 파일 디스크립터의 두 호출 사이에서, 첫 번째 fd에서 EOF에 도달하기 전에 다른 파일로 전환될 경우, 우리는 get_next_line이 정의되지 않은 동작을 가진다고 생각한다.
+ get_next_line은 바이너리 파일을 읽을 때 정의되지 않은 동작을 가진다고 생각해야한다. 하지만 원한다면 이런 동작을 논리적으로 구현해도 된다.
+ 전역 변수는 금지
+ 함수는 'EOF에 도달하였고 \n이 존재하지 않을 때'를 제외하고는 항상 \n이 뒤따라오는 한 줄을 읽고 해당 한 줄을 반환해야한다.
# FOR BONUS
+ 하나의 정적 변수로 get_next_line 성공하기
+ get_next_line을 사용하여 여러 개의 파일 디스크립터를 관리할 수 있다. 예를 들어, 파일 디스크립터 3, 4, 5에 접근 가능한 경우, get_next_line은 각 디스크립터의 리딩 스레드를 잃지 않은 채로 3에서 한 번, 4에서 한 번, 다시 3에서 한 번, 5에서 한 번 호출될 수 있습니다.
'42seoul > circle-1' 카테고리의 다른 글
[ ft_printf ] 1. printf (0) | 2021.12.29 |
---|---|
[ printf ] 0. 문제 이해하기 (0) | 2021.12.23 |
[ GNL ] 04. 선행지식_read() 함수 (0) | 2021.11.03 |
[ GNL ] 03. 선행지식_정적변수(Static) (0) | 2021.11.03 |
[ GNL ] 02. 선행지식_파일 디스크립터 (0) | 2021.10.31 |
댓글