๐ก
get_next_line ๋ณธ๋ฌธ
์ฌ์ ์ง์
- file descriptor
- ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ ๊ทผํ ๋ ํ ๋น๋์ด ํ์ผ์ ์ฐธ์กฐํ๋ index๋ผ๊ณ ์๊ฐํ์
์์๊ฐ ์๋ ์ ์๋ก ํํ๋๋ฉฐ 0 ~ OPEN_MAX ๊น์ง์ ๊ฐ์ ๊ฐ์ง์ ์์ผ๋ฉฐ OPEN_MAX๋ ํ๋ซํผ๋ง๋ค ๋ค๋ฅด๋ค
0 - stdin
1 - stdout
2 - stderr
- open ํจ์
#include <fcntl.h>
int open(const char *path, int flag)
path
- ์ด๊ณ ์ํ๋ ํ์ผ, ๋์ผํ ๋๋ ํ ๋ฆฌ์ ์์ง ์์ผ๋ฉด ๊ฒฝ๋ก๋ ํจ๊ป ์ ์ด์ฃผ์
flag
- ํ์ผ์ ์ด ๋ ์ฌ์ฉํ ์ต์ 1. O_RDONLY : ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ผ ์ด๊ธฐ
2. O_WRONLY : ์ฐ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ผ ์ด๊ธฐ
3. O_RDWR : ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ํ์ผ ์ด๊ธฐ
*gnl ํ ์คํธ ํ ๋์๋ ์๋ณธํ์ผ์ด ํผ์๋๋ฉด ์๋๋ฏ๋ก O_RDONLY๋ฅผ ์ฌ์ฉํ๋ค
return values
- ์ฑ๊ณต์ ์ผ๋ก ํ์ผ์ ์ด๊ฒ ๋๋ฉด ํ์ผ ๋์คํฌ๋ฆฝํฐ(fd)๋ฅผ ๋ฐํํ๊ณ ์คํจํ๋ฉด -1์ ๋ฐํ
- read ํจ์
#include <unstd.h>
ssize_t read(int fd, void *buf, size_t nbyte)
fd
- ์ฝ๊ณ ์ ํ๋ ํ์ผ์ fd๋ก ์ผ๋ฐ์ ์ผ๋ก open ํจ์์ ๋ฆฌํด๊ฐ์ ์ฌ์ฉํ๋ค
buf
- ์ฝ์ด ๋ค์ธ ์ ๋ ฅ๊ฐ์ ์ ์ฅํ ๋ฒํผ
nbyte
- ์ฝ์ด ๋ค์ผ ์ฌ์ด์ฆ, ์์๋งํผ ์ฝ์ ์ ์์ผ๋ฏ๋ก size_t ์ฌ์ฉํ๋๋ฏ ์ถ๋ค
return values
- ์ฑ๊ณต์ ์ผ๋ก ํ์ผ์ ์ฝ๊ฒ ๋๋ฉด ์ฝ์ด๋ค์ธ ๋ฐ์ดํธ๋ฅผ ๋ฐํํ๊ณ EOF ๋ฅผ ์ฝ์ผ๋ฉด 0์ ๋ฐํํ๋ค.
์คํจํ๋ฉด -1 ๋ฐํ
*-1์ ๋ฆฌํด๋ฐ๋ ์ํฉ์ด ์๊ธฐ ๋๋ฌธ์ size_t ๊ฐ ์๋๋ผ signed ๋ก ๋ณ์๋ฅผ ๋ฐ์์ผ ํ๋ค.
- static variable
#include <stdio.h>
void func() {
static int x = 0;
/* x๋ func()๊ฐ 5๋ฒ ํธ์ถ๋ ๋์ ๋จ ํ๋ฒ ์ด๊ธฐํ ๋์๊ณ ,
๋ณ์๋ ํจ์๊ฐ ํธ์ถ๋๋ ๋์ ์ด 5๋ฒ ์ฆ๊ฐํ๋ค.
x์ ์ต์ข
์ ์ธ ๊ฐ์ 5์ด๋ค. */
x++;
printf("%d\n", x); // x ๊ฐ์ ์ถ๋ ฅํ๋ค
}
int main() {
func(); // ์ถ๋ ฅ: 1
func(); // ์ถ๋ ฅ: 2
func(); // ์ถ๋ ฅ: 3
func(); // ์ถ๋ ฅ: 4
func(); // ์ถ๋ ฅ: 5
return 0;
}
- ํ์ด๋ ์คํ์ด ์๋๋ผ ๋ฐ์ดํฐ ์์ญ์ ํ ๋น๋จ
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ธฐ ์ ์ ์ปดํ์ผ ๊ณผ์ ์ ์ ์ธ๋จ. ์ ์ธ์ ์ด๊ธฐํ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก NULL๋ก ์ด๊ธฐํ
- ์์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ๋ณ์์ ํน์ง์ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค. ํจ์๊ฐ ๋๋๋ ๊ฐ์ด ์ ์ฅ๋๋ ๋ณ์
*gnl ์์ \n์ ๋ง๋ํ ๋จ์ ๋ฒํผ๋ฅผ ์ ์ฅ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค
์๊ฐ๊ฑฐ๋ฆฌ
- char **line
์ ์ด์คํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊ฑธ๊น?
line์ ๊ฐ์ ๋๊ธฐ๋ฉด ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ํจ์ ๋ฐ์์๋ ์ฌ์ฉํ ์ ์์ผ๋๊น line์ ์ฃผ์๊ฐ์ ๋๊ธด๊ฒ
์ด์คํฌ์ธํฐ๋ ๊ฒฐ๊ตญ์ ํฌ์ธํฐ, ์ด๋ ต๊ฒ ์๊ฐํ์ง ๋ง์
- static variable ํ์ฉ
read ํจ์๋ก ํ์ค์ ์ฝ์์๋ '\n'์ ๋ง๋๋ฉด ๊ทธ ์ดํ์ ๊ฐ์ ๋ค์์ ํจ์๋ฅผ ํธ์ถํ์ ๋๋ ์ฌ์ฉํ ์ ์๊ฒ
๋ฐ๋ก ์ ์ฅํด ๋์ด์ผ ํ๋ค. ๊ทธ๋์ ํจ์๊ฐ ์ข ๋ฃ๋์ด๋ ๊ฐ์ด ๋จ์์๊ฒ ํ๋ ค๊ณ ์ ์ ๋ณ์๋ก ์ ์ธํด ์ฃผ์๋ค.
- free()
๋์ ํ ๋น์ ๋ฐ๋ณต๋ฌธ์์ ๋ง์ด ์ฌ์ฉํ๋๊น free() ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ง ์์ผ๋ฉด ์ด์ ์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ์ ์๊ฐ ์์ด์
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธด๋ค. ๋จธ๋ฆฌ์์ผ๋ก ๊ผผ๊ผผํ ๋๋ฒ๊น ํ๋์ ๋ฐ์ ์๋ค.
- return values
read ํจ์์ ๋ฆฌํด๊ฐ๊ณผ gnl ํจ์์ ๋ฆฌํด๊ฐ์ ๊ฒฝ์ฐ๋ค์ ์ ์๊ฐํด๋ณด์
ํ์ผ์ ๋๊น์ง ๋ค ์ฝ์ด์ 0์ ๋ฐํํ ๊ฒฝ์ฐ์ ๋นํ์ผ์ ์ฝ์ด์ 0์ ๋ฐํํ๋ ๊ฒฝ์ฐ
- ์ค๋ณต๋๋ ์ฝ๋ ์ค์ด๊ธฐ
int get_next_line(int fd, char **line)
{
static char *store[OPEN_MAX];
char buf[BUFFER_SIZE + 1];
int read_size;
int index;
if (fd < 0 || line == 0 || BUFFER_SIZE < 1 || fd > OPEN_MAX)
return (-1);
while ((read_size = (read(fd, buf, BUFFER_SIZE))) > 0)
{
buf[read_size] = '\0';
store[fd] = ft_strjoin(store[fd], buf);
if ((index = ft_strchr_index(store[fd], '\n')) >= 0)
return (ft_newline_line(&store[fd], index, line));
}
return (ft_eof_line(&store[fd], line, read_size));
}
๋ฐ๋ณต๋ฌธ ๋ง์ง๋ง์ if๋ฌธ๊ณผ ๋ง์ง๋ง return์ด ๋น์ทํ ์ญํ ์ ํด์ ์ค์ฌ๋ณด๋ ค๊ณ ์๋ํด๋ดค์ง๋ง ๊ฒฐ๊ตญ ์คํจํ๋ค...
๊ผญ ๋ค์ ๋ด๋ณด๊ธฐ๋ก ํ์
'42' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
FdF (0) | 2021.11.30 |
---|---|
push_swap (0) | 2021.07.15 |
Born2beroot (2) | 2021.06.04 |
ft_printf (0) | 2021.05.30 |