본문 바로가기

C Language

read 함수 설명

이 코드는 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