cheating λ°©μ§λ₯Ό μν΄ μ£Όμ ν¨μλ₯Ό μ μΈν μΌλΆ ν¨μλ μμ±νμ§ μμμ΅λλ€. μ°Έκ³ λΆνλ립λλ€. :)
νμΌ λμ€ν¬λ¦½ν°(fd)λ₯Ό ν΅ν΄ ν
μ€νΈμμ κ°ν λ¬Έμ(\n
)κ° λμ¬ λκΉμ§ λΌμΈμ μ½μ΄ λ°ννλ ν¨μ
char *get_next_line(int fd)
fd
: νμΌ λμ€ν¬λ¦½ν°νλ‘μΈμ€ λ΄μμ μ΄λ¦° νμΌμ ꡬλΆνκΈ° μν μ μ
fd | represents |
---|---|
0 | standard input : νμ€ μ λ ₯ |
1 | standard output : νμ€ μΆλ ₯ |
2 | standard error : νμ€ μλ¬ |
open ν¨μλ₯Ό μ΄μ©ν΄ νμΌμ λ΄μ©μ μ½λ ν¨μ
size_t read(int fd, void *buff, size_t bytes)
unistd.h
fd
: νμΌ λμ€ν¬λ¦½ν°buff
: μ½μ νμΌμ λ΄μ©μ μ μ₯ν λ°°μ΄bytesλ§νΌ fdλ₯Ό μ½μ΄ buffμ μ μ₯νλ ν¨μ
λ©λͺ¨λ¦¬μ λ°μ΄ν° μμμ μ μ₯λμ΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λ λκΉμ§ λ¨μμλ λ³μ
static char *record
β μ§μ λ³μμμ μ°¨μ΄
static λ³μλ λ©λͺ¨λ¦¬μ data μμμ μ μ₯λκ³ , ν¨μ νΈμΆκ³Ό λμμ κ°μ΄ μ΄κΈ°νλκ±°λ μ κ±°λμ§ μλ λ°λ©΄,
μ§μ λ³μλ μ€ν μμμ μ μ₯λκ³ , ν¨μ μ’ λ£ ν μ κ±°λλ€.
TIMEOUT
μ΄ λ΄λ€λ©΄, ft_strlen
μ while 쑰건μμ μ¬μ©νκ³ μλμ§ νμΈνμ!ft_strjoin
μμ NULL κ°λλ νμ!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_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));
}
}