내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
|
고수준 |
저수준 |
버퍼 사용 |
사용 |
메모리로 직접 읽어들임 |
입출력 대상 |
스트림 |
파일 핸들 |
속도 |
느리다. |
빠르다. |
문자 단위 입출력 |
가능 |
가능하지만 비효율적이다. |
세밀한 조작 |
어렵다. |
가능하다. |
난이도 |
비교적 쉽다. |
조금 어렵다. |
④ 두 방식의 가장 큰 차이점은 버퍼의 사용 유무이며 나머지는 이에 따라 파생되는 특성들이다.
⑤ '버퍼'란 '스트림으로부터 입출력되는 데이터를 잠시 저장하는 메모리 영역'이다.
Ⅱ. 입출력과 스트림(Stream) (참고함 : C언어 스트림의 이해)
① 프로그램에서의 데이터 입력과 출력은 데이터의 흐름을 의미한다. 프로그램의 밖으로 나가면 출력이고, 밖에서 프로그램으로 들어오면 입력이다.
② 입력의 대표적인 예는 키보드이고, 출력의 대표적인 예는 모니터이다. 여기서 그 대상이 파일이 될 수도 있다.
③ 스트림은 이런 대상과 대상을 이어주는 단방향 통로이다.
④ stdin, stdout등은 C언어에서 기본적으로 제공하는 표준 스트림으로 자동으로 프로그램을 킬 때 열리고, 끌 때 닫힌다.
파일포인터 |
기능 |
내용 |
stdin(standard input file) |
표준입력 |
키보드로 입력받음 |
stdout(standard output file) |
표준출력 |
화면으로 출력 |
stderr(standard error file) |
표준오류출력 |
화면으로 오류메시지 출력 |
⑤ 대부분의 운영체제는 서로 다른 장치들을 같은 스트림으로 이어주고 있으므로 동일한 방식으로 입출력을 관리할 수 있다.
⑥ 스트림은 내부에 입출력 버퍼를 가지고 있으며 이 버퍼는 스트림에 의해 자동으로 관리된다.
⑦ 스트림의 현재 상태는 FILE구조체에 기억되며, 이는 stdio.h에 다음과 같이 정의되어 있다. (VS2017기준)
typedef struct _iobuf { void* _Placeholder; } FILE;
Ⅲ. 고수준 파일 입출력 함수들
함수명 |
형식 | 기능 |
fopen() |
FILE* fopen (const char* filename, const char* mode) | 파일과 연결된 새로운 스트림을 개방하고, FILE형 구조체를 만들어 개방한 스트림에 관한 정보를 기입한 후, 그 포인터를 리턴한다. |
fclose() |
int fclose(FILE* stream) | 개방한 스트림을 닫는다. |
fgetc() |
int getc(FILE* stream) | 스트림으로부터 한 문자를 읽어온다. |
fputc() |
int putc(int c, FILE* stream) | 스트림으로 문자c를 출력한다. |
fgets() |
char* fgets(char* s, int n, FILE* stream) | 스트림에서 문자열을 읽어와 s에 기록한다. |
fputs() |
int fputs(const char* s, FILE* stream) | 문자열을 스트림으로 출력한다. |
ungetc() |
int ungetc(int c, FILE* stream) | 문자 c를 입력 스트림으로 다시 push한다. |
fscanf() |
int fscanf (FILE* stream, const char* fromat, ...) | 스트림으로부터 서식화된 입력을 행한다. (scanf와 동일) |
fprintf() |
int fprintf (FILE* stream, const char* format, ...) | 스트림으로 서식화된 출력을 행한다. (printf와 동일) |
fread() |
size_t fread (void* ptr, size_t size, size_t n, FILE* stream) | 스트림으로부터 길이가 size인 데이터 항목 n개를 ptr이 가리키는 메모리로 읽어들인다. |
fwirte() |
size_t fwrite (const void* ptr, size_t size, size_t n, FILE* stream) | 스트림으로 ptr이 가리키는 곳에 있는 데이터를 size*n바이트만큼 출력한다. |
fseek() |
int fseek(FILE* stream, long int offset, int whence) | 스트림의 파일 포인터를 새롭게 설정한다. |
ftell() |
int ftell(FILE* stream) | 스트림의 현재 파일 포인터의 위치를 조사한다. |