파일스트림을 통한 입출력



C 언어에서 입출력을 위해서 #include <stdio.h>를 통해 printf 함수( )를 활용해서 출력을 했다. C++은 C언어와 마찬가지로 입출력에 관한 기능을 언어에서 기본적으로 제공하지 않는다. 컴파일러 개발자에게 컴파일러를 만들 때 입출력 기능을 해당 하드웨어에 가장 적합한 형태로 만들도록 자유도를 주었기 때문이다. 하지만 내가 사용하는 Visual C/C++와 같이, 대부분의 C++ 컴파일러는 iostream과 fstream 헤더 파일에 정의되어 있는 클래스 라이브러리를 제공하기 때문에 우리는 iostream 및 fstream을 공부하여 파일스트림을 통해 입출력을 할 수 있다.


iostream과 fstream 클래스 라이브러리의 가장 핵심은 바로 스트림(stream)이다. C++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, 운영체제에 의해 생성된 스트림(stream)이라는 흐름을 통해 입출력 기기에 데이터를 전달해 입력을 받거나 출력을 한다.


결국, 스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 흐름을 나타낸 것이다.



1. 버퍼의 개념, 스트림의 핵심


스트림은 내부에 버퍼(buffer)라는 임시 메모리 공간을 가진다. 입력 시 Enter 키(\n)를 누르면 입력 버퍼를 비워 바로 프로그램에 전달을 한다. 즉, 버퍼에서는 입력 중 자동으로 개행 문자를 전달받거나 버퍼가 가득 차면 버퍼를 비우게 된다.


다음은 표준입력이 처리되는 과정을 도식화하였다.

 



 다시 한번 정리하자면 표준 입력( ex. 키보드)은 입력되는 문자를 입력 버퍼에 저장했다가 엔터 키(\n)가 입력되거나 버퍼가 가득 차면 지정된 변수(할당한 메모리 - 배열 등)로 버퍼의 내용을 비우면서 메모리의 내용을 옮긴다.  마찬가지로 표준 출력(화면 출력, 파일 저장 등)은 출력 버퍼에 문자가 저장되었다가 특정 조건에 의해 버퍼가 비워지면 출력되는 것이다. 참고적으로 입/출력 버퍼가 비워지는 시점은 운영체제나 설정에 따라 다르다.


즉, 버퍼는 키가 눌리는 이벤트가 발생할 때 마다 즉시 프로그램에게 이를 전달하는 것이 아니라, 모아서 한번에 전달하는 것임을 알 수 있다. 이를 버퍼링이라고 부른다.

 

1. 문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하므로, CPU 사용횟수와 메모리 접근 횟수도 줄어든다.

2. 사용자가 문자를 잘못 입력했을 경우 수정을 할 수가 있다. ex) 콘솔에서 입력하다 오타 발생 시 지우고 엔터누를 수 있음

 

하지만 버퍼가 있다고 해서 항상 좋은 것은 아니다. 바로 동작해야 하는 프로그램(Ex 게임, 문서작업 )에서는 키를 누르는 즉시 바로 전달되어야 한다.

예를 들어 글자를 입력하는데 엔터에 입력할 때까지 화면에 글자가 안보인다면 당혹스러울 것이다.

 

입력을 결정할 때는 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력 중 자신의 목적에 맞게 버퍼의 사용 여부를 판단해 도입해야한다



2. 입력버퍼를 사용하지 않는 함수 : getch()



2.1) getch


이 함수를 사용하기 위해서는 console input/output 즉, 콘솔 입출력 함수를 제공하는 헤더 파일로서 conio.h 헤더 파일을 include 해야한다. 다만 이 헤더파일은 C 언어 표준이 아니고, MS-DOS 때 부터 사용되었기 때문에 POSIX 함수도 아니어서 Visual Studio에서도 비표준함수라며 에러를 발생시킨다. 이를 없애주기 위해서는 _getch()와 같은 형태로 사용하면 된다.


2.2) 문법

int getch(void);

읽은 문자를 반환

# 사용 예제

10개를 입력받을 때까지, 계속 getch()를 반복문 실행을 하였다. 10개의 글자를 입력받은 후, 종료되는 프로그램을 작성하라.


int main(){

printf("Without buffer!\n");

char ch;

int cnt=0;

while (cnt < 10){

ch = _getch();

printf("%c",ch);

cnt++;

}

}


3. 파일스트림 함수


# 수정중

'C++' 카테고리의 다른 글

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

+ Recent posts