Search
Duplicate

get_next_line 시작하기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Scrap
태그
9 more properties

먼저 읽어 볼만한 내용

생각해 볼 문제

read() 함수 실행 시 나올 수 있는 결과 (BUFFER_SIZE == 32 라 가정)
1.
"abcdefg(\n 또는 EOF)" (길이 < BUFFER_SIZE && ('\n' || '\0') 존재)
2.
"1234567890123456789012" (길이 == BUFFER_SIZE && '\0' 존재)
3.
"1234567890123456789012345678901234567890 (길이 > BUFFER_SIZE)
4.
"12345\n9862\nABCCEFG\n" (길이 < BUFFER_SIZE && '\n' 이 여러개)
5.
EOF (끝)
6.
"" (빈 문자열)
7.
-1
대충 이 정도 상황들이 있을 수 있다.
1, 2 번은 읽은 내용 자체가 한 줄이라 읽은 내용만 반환해도 된다.
3번은 '\n', '\0', EOF 가 오기 전까지 읽고 반환해야 된다.
4번은 '\n' 이전까지의 내용들을 나누어 get_next_line 호출마다 반환한다.
5번은 4번 같은 경우 때문에 무조건 0 을 반환할 수 없다. 이전에 읽은 내용을 다 반환한 경우만 0 반환한다.
6번도 빈 문자열이지만 '\0' 이 존재하는 문자열이기 때문에 1 반환과 반환값이 존재한다.
BUFFER_SIZE 안에 항상 '\n' 이 존재한다고 가정하면 안된다. BUFFER_SIZE = 32 인데 아래와 같이 길이가 32 가 넘는 하나의 문장을 읽으려면 BUFFER_SIZE 만큼만 읽어서는 안된다.
"abcdefghijklmnopqrstuvwxyz12345678901234567890\n" 길이가 45정도 된다.
이 문장을 읽으려면 먼저 BUFFER_SIZE 만큼 읽고, 나머지 부분을 읽어야 한다.
그러면 크기가 고정된 char 형 변수보다는 포인터를 사용해 동적 할당해 준다.
char buffer[BUFFER_SIZE] char *what_i_read
C
복사
buffer 에 BUFFER_SIZE 만큼 읽고 what_i_read 에 '\n' 이 나오기 전까지 읽은 값들을 이어준다.
buffer 의 크기는 BUFFER_SIZE 면 안된다.
"abcdefghijklmnopqrstuvwxyzx12345678901234567890\n" BUFFER_SIZE = 32 일 때 이 문장을 읽는다고 하자. 그러면 총 두 번 읽어서 what_i_read 에 이어줘야 한다.
두 문자열을 이어줄 때, strjoin() 과 같은 함수를 쓰게 될 거고 그러려면 문자열의 길이도 구해야 한다.
보통 문자열의 길이를 구할 때 우리는 '\0' 까지 읽으면서 몇 개를 읽었는지 세는 식으로 길이를 구한다.
그런데 buffer 를 딱 BUFFER_SIZE 만큼의 크기만 주면, read() 함수로 BUFFER_SIZE 만큼 읽은 결과에는 '\0' 는 존재하지 않는다. 문자열의 정확한 길이를 구할 수 없게 된다.
char buffer[BUFFER_SIZE + 1]
C
복사
BUFFER_SIZE + 1 만큼의 공간을 할당하고 read() 실행 후 '\0' 를 추가해준다.
static 변수의 사용
"12345\n9862\nABCCEFG\n" (길이 < BUFFER_SIZE && '\n' 이 여러개)
처음에 이런 경우도 가정을 했었다.
먼저 buffer 에 다 읽고, char *what_i_read 로 strdup 을 해준 상태다.
이제 get_next_line 이 호출되 때마다
"12345"
"9862"
"ABCDEFG" 를 결과로 줘야 한다.
그런데 what_i_read 는 get_next_line() 에서만 쓰는 지역변수라서 읽은 내용들이 다 사라진다.
이때 static 변수를 사용한다.
static char *what_i_read
C
복사
이제 what_i_read 는 get_next_line() 이 종료되도 이전에 읽은 값들을 잃지 않게 됐다.
fd 의 범위는??
프로그램이 메모리에서 실행될 때 기본적으로 할당되는 파일 디스크립터 값이 3개가 있다.
표준 입력(0), 표준 출력(1), 표준 에러(2) 가 있다.
이 3개를 제외하고 파일 디스크립터는 [3, OPEN_MAX] 의 범위 중 가능한 값을 할당받는다.
OPEN_MAX 는 프로그램이 열 수 있는 파일 디스크립터 개수다.
OPEN_MAX 값 확인하기
한글 입력 시 BUFFER_SIZE 만큼 입력 안되는 문제
일단 이 부분은 프로젝트 완료에 아무런 문제가 없다.
#define STDIN 0 #define BUFFER_SIZE 32 int main(void) { int read_cnt; char buffer[BUFFER_SIZE + 1]; read_cnt = read(STDIN, buffer, BUFFER_SIZE); buffer[read_cnt] = '\0'; printf("READ CNT : %d\n", read_cnt); printf("%s\n", buffer); }
C
복사
BUFFER_SIZE == 32 인데도 한글은 10글자밖에 입력되지 않는다... ???
왜 이런 문제가 생길까??
인코딩 때문에 이런 문제가 생긴다.
MAC OS 는 default 로 utf-8 인코딩을 사용하기 때문에 한글은 3 바이트로 인식된다.

기본적인 작동 과정

사용한 테스터

프로젝트 해결에 필요는 없지만 알아두면 좋은 정보