728x90

파일 입력은 stdio.h에 선언되어 있는 fscanf(), getc(), fgets()와 같은 입력 함수들 중 하나를 호출하는 것이다. 이 함수들 중 하나를 호출하면, 한덩어리의 데이터가 파일로부터 버퍼가 복사된다. 일반적으로 512바이트이거나 그것의 배수인 4,096바이트 또는 16,384바이트 이다. 최초의 함수 호출은, 버퍼를 채울 뿐 아니라 fp가 가리키는 구조체에 있는 값들을 설정한다. 특별히, 스트림에서의 현재 위치, 버퍼 안으로 복사된 바이트 수가 설정된다. 일반적으로 현재 위치는 바이트 0부터 시작한다.

 

데이터 구조체와 버퍼가 초기화된 후, 입력 함수는 요청된 데이터를 버퍼로부터 읽는다. 이 과정에서 파일 위치 표시자는 마지막으로 읽은 문자 바로 다음 문자를 가리키도록 설정된다. stdio.h계열의 모든 입력 함수들이 같은 버퍼를 사용하기 때문에, 그들 중 어느 한 함수의 호출은 직전에 이루어진 어느 함수 호출이 행동을 끝낸 위치에서부터 시작한다.

 

버퍼에 있는 모든 문자들을 읽었다는 것을 알게 되었을 때, 입력 함수는 버퍼 크기만큼의 그 다음  데이터 덩어리를 파일로부터 버퍼로 복사하도록 요청한다. 이와 같은 방법으로, 입력 함수들은 파일의 끝까지 파일의 모든 내용을 읽을 수 있다. 마지막 버퍼만큼의 데이터 덩어리에 있는 마지막 문자를 읽은 후에, 입력 함수는 파일 끝지시자를 참으로 설정한다. 그러고 나면 입력 함수의 다음번 호출은 EOF를 리턴한다.

 

출력 함수도 버퍼에 저장한다. 버퍼가 가득 차을 때, 데이터는 파일로 복사된다.

 

int fflush()함수

fflush()함수는 다음과 같은 프로토 타입을 가진다. 

int fflush(FILE * fp);

fflush()함수를 호출하는 것은, 출력 버퍼에 아직 남아있는 데이터를 fp가 가리키는 출력 파일로 보낸다. 이 과정을 버퍼 비우기(flusing buffer)라 한다. fp가 널 포인터면, 모든 출력 버퍼들을 비운다. fflush()를 입력 스트림에 사용하는 것의 영향은 정의되지 않는다.

 

int setvbuf() 함수

setvbuf() 함수는 다음과 같은 프로토타입을 가진다.

int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);

setvbuf()함수는 표준 입출력 함수들이 사용할 또하나의 버퍼를 설정한다. 이 함수는, 파일을 열고 난 후 그 스트림에 어떤 다른 조작이 가해지기 전에 호출된다. 포인터 fp는 스트림을 나타낸다. buf는 사용할 버퍼를 가리킨다. buf의 값으로 NULL을 사용하지 않는다면, 사용자가 버퍼를 만들어야 한다. 예를 들어, 1024개의 char형으로 이루어진 배열을 선언하고, 그 배열의 주소를 전달할 수 있다. 그러나 buf의 값으로 NULL을 사용한다면, 함수가 직접 버퍼를 할당한다. size 변수는 배열의 크기가 얼마인지 setvbuf()에게 알려준다. mode는 _IOFBF(완전 버퍼링; 버퍼가 가득 찼을때 버퍼를 비운다.) _IOLBF(라인 버퍼링; 버퍼가 가득 찼거나 개행이 쓰여졌을 때 버퍼를 비운다.) _IONBF(비 버퍼링; 버퍼를 사용하지 않는다.)중 어느 하나를 선택한다. 이 함수는 성공하면 0을 리턴하고, 실패하면 0이 아닌값을 리턴한다.

 

크기가 각각 3000바이트인 저장된 데이터 객체들을 다루는 프로그램이 있다고 가정하자. setvbuf()를 사용하면, 버퍼 크기가 데이터 객체의 크기와 일치하는 버퍼를 만들 수 있다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 30  (0) 2019.06.16
C언어 공부 29  (0) 2019.06.16
C언어 공부 27  (0) 2019.06.12
C언어 공부 26  (0) 2019.06.11
C언어 공부 25  (0) 2019.06.11

+ Recent posts