반응형

프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍 31

표준 입출력 - 파일 스트림 작업 위치 변경 및 확인, fseek, ftell, rewind

파일 입출력 작업 중에 프로그램 방식으로 작업 위치를 변경하거나 확인할 수 있는 함수를 제공하고 있습니다. fseek 함수는 작업 위치를 변경할 때 사용하는 함수이며 ftell 함수는 현재 작업 위치를 확인하는 함수입니다. 또한 작업 위치를 시작 위치로 이동하는 rewind 함수를 제공하고 있어요. /********************************************************************** * ex_fseek.c * * exmple source – test binary I/O * **********************************************************************/ #include #define MAX_NAME_LEN 20 ty..

표준 입출력 - 바이너리 모드 입출력 함수, fread, fwrite

프로세스의 메모리 상태를 파일에 기록해 두었다가 다음 실행 시점에 로딩하여 상태를 복원하는 것은 매우 흔한 일입니다. 이 때 텍스트 모드로 모든 멤버를 하나 하나 기록하여 로딩하는 것 보다 메모리를 덤핑하여 파일에 기록하고 로딩하는 바이너리 모드의 입출력 함수를 사용하는 것이 효과적입니다. 표준 입출력 라이브러리에서는 바이너리 모드의 입출력 함수로 fread와 fwrite를 제공하고 있어요. /********************************************************************** * ex_binio.c * * exmple source – test binary I/O * ******************************************************..

표준 입출력 - 텍스트 모드 입출력 함수들

이번에는 자주 사용하는 표준 입출력 라이브러리에서 제공하는 텍스트 모드 입출력 함수들을 소개할게요. 텍스트 모드로 입출력하는 함수는 문자 하나를 입출력하는 함수들과 라인 단위로 문자열을 입출력하는 함수들, 포멧에 맞게 입출력하는 함수들로 구분할 수 있어요. 다음은 표준 입출력 라이브러리에서 텍스트 모드로 입출력하는 함수들입니다. /********************************************************************** * ex_getchar.c * * exmple source – test getchar function * **********************************************************************/ #include i..

표준 입출력 - 텍스트 모드와 바이너리 모드 입출력

표준 입출력 라이브러리에서는 텍스트 파일에 문자를 기록하고 읽어올 때 사용하는 입출력 함수와 바이너리 파일에 메모리 값을 덤핑하는 입출력 함수를 제공합니다. 파일을 열 때 디폴트는 텍스트 모드로 열고 있으며 바이너리 모드로 열 때는 "b"를 추가하여야 합니다. 참고로 "t"는 텍스트 모드이지만 디폴트 모드여서 명시할 필요가 없어요. 두 가지 모드의 차이점은 텍스트 모드에서는 모든 데이터를 문자 형태로 기록하며 바이너리 모드에서는 메모리에 있는 내용 그대로 기록한다는 것에 차이가 있어요. 예를 들어 학생 번호가 38번이라고 할 때 텍스트 모드에서는 38을 출력 함수 내부에서 문자열 "38"로 변환하여 출력합니다. 바이너리 모드에서는 메모리에 있는 내용 그래도 기록합니다. 이를 메모장과 같은 응용을 통해 확..

표준 입출력 - freopen, fdopen

표준 입출력 라이브러리에서는 fopen 외에도 freopen, fdopen 함수를 통해 파일 스트림을 열 수 있어요. 이 두 함수는 이미 열려진 파일을 재지정할 때 사용합니다. freopen은 열려진 파일 스트림을 입력 인자로 전달하고 fdopen은 파일 디스크립터를 전달합니다.#include FILE *freopen(const char *pathname, const char *mode, FILE *fp);FILE *fdopen(int fd, const char *mode);반환 값: 실패 시 NULL 다음은 main 함수 인자로 파일 명을 전달하면 표준 출력을 해당 파일명으로 재지정합니다. 이 후 printf 함수를 호출하면 콘솔 화면에 출력하지 않고 재지정한 파일에 출력하는 것을 확인할 수 있습니다...

표준 입출력 - fopen, fclose

표준 입출력 라이브러리에서는 작업할 파일을 열 때 fopen 함수를 사용합니다. 정상적으로 파일을 열면 작업할 파일 스트림 정보를 기억하는 FILE 구조체 포인터를 반환하며 실패하면 NULL을 반환합니다. 이 후에 모든 표준 입출력 라이브러리를 사용할 때 fopen 함수에서 반환한 파일 스트림을 인자로 사용합니다. 모든 작업을 완료하여 더 이상 파일 스트림을 사용하지 않는다면 fclose 함수를 호출하여 파일 스트림을 닫습니다. #include FILE *fopen(const char *pathname, const char *mode);반환 값: 실패 시 NULLmode: “r” 읽기 모드 “w” 쓰기 모드 “a” 추가 모드 “t” 텍스트 파일 모드 “b” 바이너리 파일 모드 “+” 읽기/쓰기 모두 가능..

RAW 입출력과 표준 입출력의 성능 비교

앞에서 표준 입출력에서는 버퍼링 정책(FULL BUFFERING, LINE BUFFERING, NULL BUFFERING)을 사용한다는 것을 알아보았어요. 이번에는 간단하게 open, write, close 시스템 호출을 이용한 RAW 입출력과 표준 입출력의 성능을 비교해 보기로 할게요. 다음은 1바이트씩 10000번 파일에 기록하는 것을 RAW 입출력과 표준 입출력을 사용하는 것을 비교하는 소스 코드입니다. 표준 입출력을 사용하는 것은 0부터 8000까지 500씩 늘려가면서 버퍼를 설정하고 있어요.

표준 입출력 - FILE 구조체

표준 입출력 함수에서는 작업할 파일에 관한 정보를 FILE 구조체 형식으로 기억합니다. FILE 구조체는 C 컴파일러에 따라 조금씩 차이가 있지만 파일 기술자, 버퍼 시작 주소, 버퍼에서 입출력할 위치 주소, 작업 관련 플래그 등을 제공합니다. struct _IO_FILE{ int _fileno; //파일 기술자 char *_IO_read_ptr; //읽기 버퍼에서 현재 읽을 위치 주소 char *_IO_read_base; //읽기 버퍼의 시작 주소 char *_IO_read_end; //읽기 버퍼에 처리할 데이터가 있는 영역의 끝 주소 char *_IO_write_ptr; //쓰기 버퍼에서 현재 기록할 위치 주소 char *_IO_ write _base; //쓰기 버퍼의 시작 주소 int _flags;..

표준 입출력 - 버퍼 및 버퍼링 정책 설정

C언어 표준 라이브러리에서 제공하는 입출력 함수들은 평균적으로 성능이 높게 입출력할 수 있게 고안하여 입출력 시스템 호출에 관해 깊은 지식과 경험이 없는 이들도 충분히 높은 성능을 갖게 프로그래밍할 수 있습니다. 물론 C언어 표준 입출력 라이브러리에서는 개발자가 버퍼링 정책을 변경하거나 버퍼를 설정하는 몇 가지 함수를 제공하고 있습니다. /*********************************************************************** * ex_change_buffering.c * * example source – print string(print character and sleep) * ************************************************..

파일입출력 - 버퍼링

리눅스에서는 파일 입출력을 할 때 물리적인 파일에 조회 및 기록의 횟수를 최소화하여 성능을 높이기 위해 버퍼링 정책을 사용하고 있습니다. 만약 write 호출로 데이터를 쓰기 명령을 전달하면 해당 파일 작업을 위한 버퍼에 기록을 해 두었다가 정책에 따라 특정 시점에 물리적인 파일에 기록을 수행합니다. 리눅스에서 제공하는 버퍼링 정책에는 버퍼가 꽉 차면 물리적인 파일에 기록하는 FULL BUFFERING과 꽉 차거나 개행문자가 오면 처리하는 LINE BUFFERING, 버퍼를 사용하지 않는 NULL BUFFERING 정책을 제공하고 있습니 디폴트 버퍼링 정책은 FULL BUFFERING이며 char 장치 파일에 관한 작업은 LINE BUFFERING 정책을 사용합니다. 그리고 오류를 출력하는 stderr ..

반응형