๐Ÿ’ก

get_next_line ๋ณธ๋ฌธ

42

get_next_line

์•„์˜ณ์ด 2021. 5. 13. 09:09

 ์‚ฌ์ „ ์ง€์‹

- 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