이 코드는 while 루프 조건으로 파일 디스크립터(fd)에서 데이터를 읽어 들이며, 개행 문자(\n)가 있는지 확인하는 과정을 수행합니다.
아래에서 자세히 분석하겠습니다.
🔍 코드 분석
while (!(newline = ft_strchr(line, '\n')) && (countread = read(fd, buf, BUFFER_SIZE)))
각 부분을 나눠서 설명하면:
1️⃣ ft_strchr(line, '\n')
- ft_strchr(line, '\n') → line 문자열에서 \n이 있는지 찾는다.
- 개행 문자가 있다면 newline에 그 위치의 포인터를 저장하고,
없다면 newline = NULL이 된다. - !newline → 개행 문자가 없을 때 true.
- 즉, newline이 NULL일 때만 루프가 계속 실행된다.
2️⃣ read(fd, buf, BUFFER_SIZE)
- read(fd, buf, BUFFER_SIZE) → fd에서 BUFFER_SIZE만큼 읽어 buf에 저장.
- 반환값: 읽은 바이트 수 (countread).
- 파일의 끝(EOF)에 도달하면 read()는 0을 반환 → countread = 0.
- 오류 발생 시 read()는 -1 반환.
- (countread = read(fd, buf, BUFFER_SIZE)) → countread에 read() 결과 저장.
3️⃣ while 루프 조건 해석
while (!(newline = ft_strchr(line, '\n')) && (countread = read(fd, buf, BUFFER_SIZE)))
- newline이 NULL (즉, 개행 \n이 없음).
- read()를 실행하여 countread에 읽은 바이트 수를 저장.
- countread > 0이면 계속 루프 실행.
- 개행 문자를 찾거나 read()가 0 (EOF) 또는 -1 (에러)이면 루프 종료.
📌 실제 동작 예시
예제 1: 파일에 개행 문자가 포함된 경우
🔹 파일 내용
Hello\nWorld
🔹 while 실행 과정
line 값 ft_strchr(line, '\n') 결과 read(fd, buf, BUFFER_SIZE)
"Hello" | NULL (개행 없음) | 5 (읽음) |
"Hello\n" | 개행 위치 반환 (newline 할당) | (read 실행 안 됨, 루프 종료) |
👉 newline이 NULL이 아니므로 루프 종료.
예제 2: 파일에 개행 문자가 없는 경우
🔹 파일 내용
Hello World!
🔹 while 실행 과정
line 값 ft_strchr(line, '\n') 결과 read(fd, buf, BUFFER_SIZE)
"Hello " | NULL (개행 없음) | 6 (읽음) |
"Hello W" | NULL | 5 (읽음) |
"Hello Wo" | NULL | 4 (읽음) |
... | NULL | 0 (EOF, 루프 종료) |
👉 개행 문자가 끝까지 없으면 read()가 0이 되어 루프가 종료됨.
✅ 결론
- while 루프는 개행 문자(\n)를 찾을 때까지 read()를 반복.
- 개행이 없으면 계속 읽고 BUFFER_SIZE만큼 buf에 저장.
- 개행이 발견되면 newline이 NULL이 아니므로 루프 종료.
- read()가 0을 반환하면 (파일 끝) 더 이상 읽지 않고 종료.
🚀 주로 get_next_line() 구현에서 사용됨!
'C Language' 카테고리의 다른 글
cpp 01 (0) | 2025.03.10 |
---|---|
minishell01 (0) | 2025.03.08 |
get_next_line 간단 구현 (0) | 2025.02.21 |
printf 함수 간단 구현 (0) | 2025.02.21 |
mlx_get_data_addr 펑션의 사용법 (0) | 2025.02.17 |