Goals
Understanding static variables,
file descriptor로부터 읽혀진 line(개행 기준)을 반환하는 함수를 만드는 것.
. . .
보너스는 반드시 _bonus.{c/h}라는 다른 파일 에 있어야 합니다.
...
Prototype
int get_next_line(int fd, char **line);
Turn in files
[bonus까지 하면]
+) get_next_line_bonus.c
+) get_next_line_bonus.h
+) get_next_line_utils_bonus.c
Parameters
Parameters | Description |
---|---|
fd | file descriptor for reading |
line | the value of what has been reading |
Return value
Return value | Description |
---|---|
1 | a line has been read |
0 | EOF has been reached |
-1 | an error happened |
External func
read, malloc, free
Description
Write a function which returns a line read from a file descriptor, without the newline.
줄 바꿈 없이 file descriptor에서 읽은 줄을 반환하는 함수를 작성하라.
✔get_next_line 함수를 loop 안에서 호출하면 file descriptor에서 사용할 수 있는 텍스트를 EOF가 올 때까지 한 번에 한 줄씩 읽을 수 있을 것입니다.
#include "get_next_line.h"
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main()
{
int fd;
char *line;
int i;
line = "";
fd = open("test.txt",O_RDONLY);
i = 1;
while (i < 8)
{
get_next_line(fd, &line);
printf("line %d: %s\n", i, line);
i++;
}
}
✔파일에서 읽을 때 + 표준입력으로부터 읽어
드릴 때 함수가 제대로 동작하는지 확인하십시오.
➡fd = 0
✔libft는 이 프로젝트에서 사용할 수 없습니다.
✔get_next_line이 동작하는 데 필요한 함수들이 들어있는 get_next_line_utils.c 파일을 추가해야 합니다.
✔당신의 프로그램은 -D BUFFER_SIZE=xx 플래그를 붙여서 컴파일 해야 합니다. 그것은 너의 get_next_line에서 read함수를 호출하기 위한 buffer size로 사용될 것입니다.
➡컴파일은 이런 식으로 진행됩니다
gcc -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c
✔너의 read 함수는 표준입력으로 또는 파일로부터 읽어들이기 위해서 컴파일할 때 정의된 BUFFER_SIZE를 사용해야 합니다.
✔get_next_line.h (헤더 파일)에는 적어도 get_next_line 함수의 프로토타입이 있어야 합니다.
#ifndef GET_NEXT_LINE_H
# define GET_NEXT_LINE_H
int get_next_line(int fd, char **line);
# endif;
✔만약 동일한 file descriptor의 두 호출 사이에서 첫 번째 fd에서 EOF에 도달하기 전에 다른 파일로 전환될 경우, 우리는 get_next_line이 정의되지 않은 동작을 가진다고 생각합니다.
✔lseek은 허용된 함수가 아닙니다. 파일 읽기는 오로지 한번만 행해져야합니다.
✔마지막으로 바이너리 파일을 읽을 때, 우리는 get_next_line이 정의되지 않은 동작을 가진다고 생각합니다. 그러나 당신이 원한다면, 이러한 동작을 논리적으로 만들 수 있습니다.
✔전역 변수는 금지되어 있습니다.
BUFFER_SIZE 값이 9999인 경우에도 함수는 여전히 작동하나요? BUFFER_SIZE 값이 1이라면? 10000000이라면? 왜 그런지 아시나요?
#buffer #heap #stack
get_next_line이 호출될 때마다 가능한 한 적게 읽도록 해야 합니다. 만약 newline을 만나면, 현재 line을 반환해야 합니다. 전체 파일을 읽지 말고 각 line을 처리하세요.
테스트하지 않고 너의 프로젝트를 제출하지 마세요. Cover your bases. 실행할 많은 테스트들이 있습니다.
file로부터, redirection으로부터, stdin으로부터의 읽기를 시도하세요.
표준 출력에 newline 을 보낼 때 프로그램은 어떻게 동작하나요? 그리고 CTRL-D를 하면요?
Single static variable로 get_next_line 성공하는 것.
get_next_line을 사용하여 다중 file descriptor를 관리 할 수 있는 것.
예를 들어, file descriptor 3, 4, 5가 읽을 수 있는 경우, get_next_line은 3에서 한 번, 4에서 한 번, 다시 3에 서 한 번, 5에서 한 번 호출할 수 있습니다. 각 descriptor의 reading thread를 잃지 않으면서 말이죠.
int main()
{
int fd;
char *line;
int i;
line = "";
fd = open("test.txt",O_RDONLY);
i = 1;
while (i < 8)
{
get_next_line(fd, &line);
printf("line %d: %s\n", i, line);
i++;
}
}
int main(void)
{
char *line = 0;
int ret;
int fd;
fd = open("testfile2", O_RDONLY);
while ((ret = get_next_line(fd, &line)) > 0)
{
printf("%s\n", line);
free(line);
}
printf("%s\n", line);
free(line);
return (0);
}