이 코드 구현은 get_next_line 함수로, 파일 디스크립터(fd)에서 한 줄을 읽어오는 함수입니다. 이 함수는 파일을 한 번에 한 줄씩 읽고, 그 줄을 반환합니다. 이 함수의 주요 목적은 버퍼에서 읽어온 내용을 적절히 분리하여 하나의 문자열로 반환하는 것입니다. 각 부분을 상세히 설명하겠습니다.
함수의 흐름 설명
char *get_next_line(int fd)
{
static char buf[BUFFER_SIZE + 1];
char *line;
char *newline;
int countread;
int to_copy;
line = ft_strdup(buf);
while (!(newline = ft_strchr(line, '\n')) && (countread = read(fd, buf, BUFFER_SIZE)))
{
buf[countread] = '\0';
line = ft_strjoin(line, buf);
}
if (ft_strlen(line) == 0)
return (free(line), NULL);
if (newline != NULL)
{
to_copy = newline - line + 1;
ft_strcpy(buf, newline + 1);
}
else
{
to_copy = ft_strlen(line);
buf[0] = '\0';
}
line[to_copy] = '\0';
return (line);
}
1. static char buf[BUFFER_SIZE + 1];
- buf는 파일에서 읽어온 데이터를 임시로 저장하는 버퍼입니다.
- BUFFER_SIZE는 한 번에 읽을 데이터의 크기입니다. 이 버퍼는 static으로 선언되었기 때문에 함수가 호출될 때마다 초기화되지 않고, 그 값이 유지됩니다.
- +1은 문자열 끝에 '\0'을 넣을 수 있도록 여유 공간을 둔 것입니다.
2. line = ft_strdup(buf);
- ft_strdup(buf)는 buf의 내용을 새로 할당된 메모리에 복사하여 line에 저장하는 함수입니다.
- 처음에는 buf가 비어있을 수 있기 때문에 빈 문자열을 복사할 수 있습니다.
3. while (!(newline = ft_strchr(line, '\n')) && (countread = read(fd, buf, BUFFER_SIZE)))
- 이 while 루프는 두 가지 조건을 만족하는 동안 반복됩니다:
- line에 '\n' 문자가 없을 때 (!newline).
- read(fd, buf, BUFFER_SIZE)가 파일에서 데이터를 읽을 때 (읽을 데이터가 있을 때).
- ft_strchr(line, '\n')는 line에서 줄바꿈 문자(\n)를 찾는 함수입니다. newline에 그 위치가 저장됩니다. 만약 line에 \n이 없다면, newline은 NULL이 됩니다.
- read(fd, buf, BUFFER_SIZE)는 파일에서 데이터를 읽어 buf에 저장합니다. 읽은 바이트 수를 countread에 저장합니다. 만약 읽을 데이터가 더 이상 없으면 read는 0을 반환합니다.
4. buf[countread] = '\0';
- read로 읽은 데이터는 buf에 저장됩니다. 그 뒤에 '\0'을 넣어 문자열로 처리할 수 있도록 합니다.
5. line = ft_strjoin(line, buf);
- ft_strjoin(line, buf)는 현재까지 읽은 line에 새로운 buf의 내용을 이어 붙이는 함수입니다. 즉, 이전에 읽었던 데이터와 새로 읽은 데이터를 연결합니다.
6. if (ft_strlen(line) == 0) return (free(line), NULL);
- 만약 line의 길이가 0이라면 (즉, 읽은 내용이 없다면), line을 free하고 NULL을 반환합니다. 파일의 끝에 도달하여 읽을 내용이 없을 때 발생할 수 있습니다.
7. if (newline != NULL)
- newline이 NULL이 아니면, 즉 line 안에 줄바꿈 문자가 존재한다면:
- to_copy = newline - line + 1;
newline 위치에서 줄바꿈까지의 크기를 계산합니다. 줄바꿈 문자를 포함하여 읽어야 할 부분의 길이를 계산합니다. - ft_strcpy(buf, newline + 1);
newline + 1부터 버퍼의 시작까지 다음에 읽을 데이터를 buf에 복사합니다. 이는 다음 읽기를 위해 버퍼에 데이터를 유지하는 작업입니다.
- to_copy = newline - line + 1;
8. else
- newline이 NULL이라면, 즉 line에 줄바꿈 문자가 없으면:
- to_copy = ft_strlen(line);
전체 line의 길이를 to_copy에 저장합니다. - buf[0] = '\0';
버퍼를 비웁니다. 더 이상 읽을 데이터가 없음을 나타냅니다.
- to_copy = ft_strlen(line);
9. line[to_copy] = '\0';
- line의 to_copy 위치에 '\0'을 넣어, 읽은 내용을 문자열로 마무리합니다. 즉, 줄바꿈을 포함하거나 포함하지 않은 부분을 정확히 잘라냅니다.
10. return (line);
- 최종적으로 line을 반환합니다. 이 line은 파일에서 읽어온 한 줄이며, 마지막에 줄바꿈 문자(\n)를 포함하거나 포함하지 않을 수 있습니다.
요약
이 함수는 파일에서 데이터를 한 줄씩 읽어오는 함수입니다. 첫 번째로 buf를 이용해 파일에서 데이터를 읽고, 읽은 데이터를 line에 저장합니다. 그 후, 줄바꿈 문자를 기준으로 데이터를 잘라서 반환합니다. 만약 줄바꿈이 없다면, 전체 내용이 반환되며, 파일 끝에 도달하면 NULL을 반환합니다. static 변수 buf를 사용하여 여러 번 호출 시에도 상태를 유지하면서 파일을 계속 읽을 수 있도록 합니다.
'C Language' 카테고리의 다른 글
minishell01 (0) | 2025.03.08 |
---|---|
read 함수 설명 (0) | 2025.02.27 |
printf 함수 간단 구현 (0) | 2025.02.21 |
mlx_get_data_addr 펑션의 사용법 (0) | 2025.02.17 |
3D 표현에서 x,y 값과 z값의 의미 (0) | 2025.02.17 |