Get_Next_Line 삽질 노트 1

Mr.뉴트리아·2020년 10월 21일
0

42Seoul 삽질노트

목록 보기
1/10
post-thumbnail

이 문서는 제 삽질과 해당 프로젝트를 풀기 위한 과정을 기록한 문서입니다. 코딩과 문서를 병행으로 작성하기에, 맞지 않는 지식이 난무할 수 있어 정답 참고용으로는 부적합하다는 것을 알아주세요.

GNL함수의 요구사항

  1. FD를 받아와, 해당 파일의 한줄을 읽어들인다. 이때, 가능한 한 적은 양을 읽어와야하며 적은 양의 기준은 한줄(\n)을 의미한다.
  2. 함수를 재 호출 시, 1번 다음 줄을 읽어들여야 하며, 최종적으로 파일의 EOF(파일의 끝)까지 읽어와야 한다.
  3. Read함수를 이용해 FD가 가리키는 파일을 읽어온다. 이때, gcc에서 -D로 선언한 BUFFER_SIZE까지만 읽어온다.

    예를 들어, "ABCDE"라는 문자열을 읽을 때 Read함수에 버퍼사이즈를 3으로 주면, ABC라는 값까지 읽어올 수 있다.

처리방법

생각1. int형 전역변수 g_start를 둬서 다음번에 같은 함수를 실행 시켰을 때, 다음 줄을 읽어올 수 있도록 함.

처리 결과, read함수가 EOF를 만날 시 0을 반환한다는 사실을 깨닫고 해당 함수를 수정함.


수정 후 출력 결과, 또다른 문제가 발생하기 시작함. BUFFER_SIZE대로 읽어오기때문에, 한번 출력됐어도 해당 함수는 EOF를 만나 읽기가 끝나버린다.

또 의문이 생겼음. 버퍼의 크기가 1일 경우 gnl에서의 출력 결과는 어떻게 나와야하는가?

감사하게도 hyukim님이 해답을 주셔서 의문이 풀림.

BUFFER을 1로 주고 5번을 출력하게 해보았다.

오! 진짜로 4문자 + 공백 이렇게 출력이 된다. 그렇다면 생각을 다시 해야하는데....

if (BUFFER_SIZE < FILE_SIZE)

오히려 이것은 쉬워진 것 같다. 함수 내부에서 read문을 돌리며 한줄씩 끊어주면 되니까.

if (BUFFER_SIZE == FILE_SIZE)

제일 쉬운 케이스. 넣고, 돌리고 끝

if (BUFFER_SIZE > FILE_SIZE)

이게 제일 복잡하다고 생각된다. 어떻게 해야하지? 한번에 EOF까지 다 긁어모아온다. 여기서 한줄을 뜯어줘도, 어떻게 EOF라고 판단을 하지? 문제에서는 가능한 한 적게 읽어오라고 했다. 그런데 사이즈77길이짜리 문자열에 BUFFER_SIZE가 1024가 들어가면 어쩔 수 없이 한줄을 다 읽어오지않나???? 일단 다 받아오고 호출할때마다 한줄씩 뜯어줄까? 그런데 그건


여기서 하지 말라고 했는데. 버퍼가 큰데 어떻게 그걸 처리하지?

일단 졸리니 내일 하자..

profile
뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.

0개의 댓글