본문 바로가기

C Language

get_next_line 간단 구현

이 코드 구현은 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 루프는 두 가지 조건을 만족하는 동안 반복됩니다:
    1. line에 '\n' 문자가 없을 때 (!newline).
    2. 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에 복사합니다. 이는 다음 읽기를 위해 버퍼에 데이터를 유지하는 작업입니다.

8. else

  • newline이 NULL이라면, 즉 line에 줄바꿈 문자가 없으면:
    • to_copy = ft_strlen(line);
      전체 line의 길이를 to_copy에 저장합니다.
    • buf[0] = '\0';
      버퍼를 비웁니다. 더 이상 읽을 데이터가 없음을 나타냅니다.

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