GetNextLine(1)

mtak·2021년 1월 16일
1

42Seoul

목록 보기
1/13
post-thumbnail

Goals
Understanding static variables,
file descriptor로부터 읽혀진 line(개행 기준)을 반환하는 함수를 만드는 것.

1. Common Instructions

. . .

  • 프로젝트에 보너스를 제출하려면, Makefile에 보너스 규칙을 포함해야 합니다. 이 보너스 규칙은 프로젝트의 메인 부분에서 금지되었던 모든 다양한 헤더, 라이브러리, 또는 함수들은 추가해야 할 것입니다.
    보너스는 반드시 _bonus.{c/h}라는 다른 파일 에 있어야 합니다.
    (= bonus 과제를 할 때 파일 이름을 _bonus.c, _bonus.h 로 만들어라 / GNL에서는 mandatory부분 짤 때 bonus 고려하면 그냥 copy&paste 하면 된다.)
    의무적으로 해야 될 파트과 보너스 파트는 별도로 평가될 것입니 다.

...

2. Mandatory part

Prototype

int get_next_line(int fd, char **line);

Turn in files

  • get_next_line.c
  • get_next_line.h
  • get_next_line_utils.c

[bonus까지 하면]
+) get_next_line_bonus.c
+) get_next_line_bonus.h
+) get_next_line_utils_bonus.c

Parameters

ParametersDescription
fdfile descriptor for reading
linethe value of what has been reading

Return value

Return valueDescription
1a line has been read
0EOF has been reached
-1an 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를 하면요?

3.Bonus part

  1. Single static variable로 get_next_line 성공하는 것.

  2. get_next_line을 사용하여 다중 file descriptor를 관리 할 수 있는 것.

예를 들어, file descriptor 3, 4, 5가 읽을 수 있는 경우, get_next_line은 3에서 한 번, 4에서 한 번, 다시 3에 서 한 번, 5에서 한 번 호출할 수 있습니다. 각 descriptor의 reading thread를 잃지 않으면서 말이죠.

main 문

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);
}
profile
노는게 젤 조아. 친구들 모여라!!

0개의 댓글