Get Next Line πŸ˜ŽπŸ“‚

zaeΒ·2022λ…„ 12μ›” 31일
1

42SEOUL

λͺ©λ‘ 보기
6/6
post-thumbnail

cheating 방지λ₯Ό μœ„ν•΄ μ£Όμš” ν•¨μˆ˜λ₯Ό μ œμ™Έν•œ 일뢀 ν•¨μˆ˜λŠ” μž‘μ„±ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ°Έκ³  λΆ€νƒλ“œλ¦½λ‹ˆλ‹€. :)

πŸ₯– get_next_line의 μš©λ„

파일 λ””μŠ€ν¬λ¦½ν„°(fd)λ₯Ό 톡해 ν…μŠ€νŠΈμ—μ„œ κ°œν–‰ 문자(\n)κ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 라인을 읽어 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

πŸ₯– get_next_line ν”„λ‘œν† νƒ€μž…

char *get_next_line(int fd)
  • fd : 파일 λ””μŠ€ν¬λ¦½ν„°
  • λ°˜ν™˜ κ°’ : κ°œν–‰κΉŒμ§€μ˜ λ¬Έμžμ—΄ (κ°œν–‰μ΄ μ—†μœΌλ©΄ ν…μŠ€νŠΈμ˜ λ§ˆμ§€λ§‰κΉŒμ§€)

πŸ₯– κ΅¬ν˜„ μ „ 지식

파일 λ””μŠ€ν¬λ¦½ν„°(fd)

ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—΄λ¦° νŒŒμΌμ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ μ •μˆ˜

fdrepresents
0standard input : ν‘œμ€€ μž…λ ₯
1standard output : ν‘œμ€€ 좜λ ₯
2standard error : ν‘œμ€€ μ—λŸ¬

read ν•¨μˆ˜

open ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 파일의 λ‚΄μš©μ„ μ½λŠ” ν•¨μˆ˜

size_t read(int fd, void *buff, size_t bytes)
  • 헀더 : unistd.h
  • fd : 파일 λ””μŠ€ν¬λ¦½ν„°
  • buff : 읽은 파일의 λ‚΄μš©μ„ μ €μž₯ν•  λ°°μ—΄

bytes만큼 fdλ₯Ό 읽어 buff에 μ €μž₯ν•˜λŠ” ν•¨μˆ˜

static λ³€μˆ˜ (정적 λ³€μˆ˜)

λ©”λͺ¨λ¦¬μ˜ 데이터 μ˜μ—­μ— μ €μž₯λ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ‚¨μ•„μžˆλŠ” λ³€μˆ˜

  • μ„ μ–Έ 방식 : static char *record
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ΄ˆκΈ°ν™”λ₯Ό ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘ν•  λ•Œ μ΄ˆκΈ°ν™”λ˜λ©°, ν•¨μˆ˜κ°€ 호좜될 λ•ŒλŠ” λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠλŠ”λ‹€.

❓ 지역 λ³€μˆ˜μ™€μ˜ 차이
static λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬μ˜ data μ˜μ—­μ— μ €μž₯되고, ν•¨μˆ˜ 호좜과 λ™μ‹œμ— 값이 μ΄ˆκΈ°ν™”λ˜κ±°λ‚˜ μ œκ±°λ˜μ§€ μ•ŠλŠ” 반면,
지역 λ³€μˆ˜λŠ” μŠ€νƒ μ˜μ—­μ— μ €μž₯되고, ν•¨μˆ˜ μ’…λ£Œ ν›„ μ œκ±°λœλ‹€.

πŸ₯– κ΅¬ν˜„ Tip!

  1. ν”„λž€μ‹œλ„·μ—μ„œ κ²€ν† λ₯Ό ν•  λ•Œ big file TIMEOUT이 λ–΄λ‹€λ©΄, ft_strlen을 while μ‘°κ±΄μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜μž!
  2. ft_strjoinμ—μ„œ NULL κ°€λ“œλŠ” ν•„μˆ˜!
  3. μ—λŸ¬ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€! - ex) fdκ°€ μŒμˆ˜μ΄κ±°λ‚˜ BUFFER_SIZEκ°€ 0보닀 μž‘μ„ λ•Œ λ“±λ“±

πŸ₯– κ΅¬ν˜„ λΌˆλŒ€

char *get_next_line(int fd){
	if (μ €μž₯ν•΄λ‘” 것에 \n이 μžˆλ‹€)
    	return (μ €μž₯ν•΄λ‘” κ²ƒμ—μ„œ \nκΉŒμ§€);
    while (1) {
    	read_len = read(fd, buff, BUFFER_SIZE);
        if (read_len == 0) // 더 이상 μ½μ„κ²Œ μ—†λ‹€
        	return (μ €μž₯ν•΄λ‘” κ²ƒμ—μ„œ \nκΉŒμ§€)
        else if (read_len == -1) // μ—λŸ¬
        {
        	free(μ €μž₯ν•΄λ‘” 것); // λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 방지
            μ €μž₯ν•΄λ‘” 것 = NULL;
            return (NULL);
        }
        buff[read_len] = '\0'; // strjoin을 μœ„ν•΄ 뒀에 널 λ„£κΈ°
        μ €μž₯ν•΄λ‘” 것 = strjoin(record, buff); // μ €μž₯ν•΄λ‘” 것 뒀에 μƒˆλ‘œ 읽은 buffλ₯Ό 이어주기
        if (μ €μž₯ν•΄λ‘” 것에 \n이 μžˆλ‹€)
        	return (μ €μž₯ν•΄λ‘” κ²ƒμ—μ„œ \nκΉŒμ§€);
    }
}

πŸ’‘ κ΅¬ν˜„ - get_next_line.c

get_next_line_utils.cλŠ” μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€ :)

// str의 κ°œν–‰μ΄ μžˆλŠ” indexλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
// κ°œν–‰μ΄ μ—†μœΌλ©΄ -1을 λ°˜ν™˜
int in_newline(char *str);

// κ°œν–‰μ΄ μžˆλŠ” κ³³κΉŒμ§€ return ν•˜κ³ 
// κ°œν–‰ λ‹€μŒ indexλΆ€ν„° 문자의 λκΉŒμ§€ λ‹€μ‹œ μ €μž₯
char	*dividing(char *str, char **remain)
{
	char	*result;
	char	*tmp;
	int		new_idx;

	new_idx = in_newline(str);
	if (!str)
		return (NULL);
	tmp = str;
	if (new_idx < 0)
	{
		*remain = NULL;
		return (str);
	}
	result = ft_substr(str, 0, new_idx + 1);
	*remain = ft_substr(str, new_idx + 1, ft_strlen(str));
	free(tmp);
	return (result);
}


char	*get_next_line(int fd)
{
	int			read_len;
	char		buff[BUFFER_SIZE + 1];
	static char	*record;

	if (in_newline(record) >= 0)
		return (dividing(record, &record));
	while (1)
	{
		read_len = read(fd, buff, BUFFER_SIZE);
		if (read_len == 0)
			return (dividing(record, &record));
		else if (read_len == -1)
		{
			free(record);
			record = NULL;
			return (NULL);
		}
		buff[read_len] = '\0';
		record = ft_strjoin(record, buff);
		if (in_newline(record) >= 0)
			return (dividing(record, &record));
	}
}
profile
코린이 μ„±μž₯ κ³Όμ •! 깊이 있게 νŒŒκ³ λ“€ 곡뢀λ₯Ό νƒμƒ‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ :)

0개의 λŒ“κΈ€