devRenio

C++ 입출력 시스템

객체지향프로그래밍II(김정준) 12주차 강의내용

스트림

  • 스트림(stream)

    • 데이터의 흐름, 혹은 데이타를 전송하는 소프트웨어 모듈
      ◼ 흐르는 시내와 유사한 개념
    • 스트림의 양 끝에는 프로그램과 장치 연결
      ◼ 보낸 순서대로 데이터 전달
      ◼ 입출력 기본 단위 : 바이트
  • C++ 스트림 종류

    • 입력 스트림
      ◼ 입력 장치, 네트워크, 파일로부터 데이터를 프로그램으로 전달하는 스트림
    • 출력 스트림
      ◼ 프로그램에서 출력되는 데이터를 출력 장치, 네트워크, 파일로 전달하는 스트림

C++ 입출력

  • C++ 입출력 스트림은 버퍼를 가짐
  • 키 입력 스트림의 버퍼
    • 목적
      ◼ 입력장치로부터 입력된 데이터를 프로그램으로 전달하기 전에 일시 저장
      ◼ 키 입력 도중 수정 가능
      ◼ <Backspace> 키가 입력되면 이전에 입력된 키를 버퍼에서 지움
    • 프로그램은 사용자의 키 입력이 끝난 시점에서 읽음
      ◼ <Enter> 키 : 키 입력의 끝을 의미
      ◼ <Enter> 키가 입력된 시점부터 키 입력 버퍼에서 프로그램이 읽기 시작
  • 스크린 출력 스트림 버퍼
    • 목적
      ◼ 프로그램에서 출력된 데이터를 출력 장치로 보내기 전에 일시 저장
      ◼ 출력 장치를 반복적으로 사용하는 비효율성 개선
    • 버퍼가 꽉 차거나 강제 출력 명령 시에 출력 장치에 출력

입출력 방식

  • 1. 스트림 입출력 방식(stream I/O)
    ◼ 스트림 버퍼를 이용한 입출력 방식
    ◼ 입력된 키는 버퍼에 저장
    ◼ <Enter>키가 입력되면 프로그램이 버퍼에서 읽어가는 방식
    ◼ 출력되는 데이터는 일차적으로 스트림 버퍼에 저장
    ◼ 버퍼가 꽉 차거나, ‘\n’을 만나거나, 강제 출력 명령의 경우에만 버퍼가 출력 장치에 출력
  • 2. 저 수준 입출력 방식(raw level console I/O)
    ◼ 키가 입력되는 즉시 프로그램에게 키 값 전달
    ◼ <Backspace>키 그 자체도 프로그램에게 바로 전달
    ◼ 게임 등 키 입력이 즉각적으로 필요한 곳에 사용
    ◼ 프로그램이 출력하는 즉시 출력 장치에 출력
    ◼ 컴파일러마다 다른 라이브러리나 API 지원
    ◼ C++ 프로그램의 호환성 낮음
  • C++ 표준은 스트림 방식만 지원
    ◼ 스트림 입출력은 모든 표준 C++ 컴파일러에 의해 컴파일됨
    ◼ 높은 호환성

  • 대표적인 구 표준(C++03) 입출력 라이브러리 클래스
    • ios, istream, ostream, iostream, ifstream, ofstream, fstream
  • 문자를 한 바이트의 char로 처리
    • cin >> 로 문자를 읽을 때, 한글 문자 읽을 수 없음
      ◼ 영어나 기호 : 1 바이트
      ◼ 한글 문자 : 2 바이트
char ch;
cin >> ch; // 키보드로 문자 입력. 한글 문자 읽을 수 없음
  • 지금도 마찬가지로 cin으로 한글을 문자 단위로는 읽을 수 없음
  • 다양한 크기의 다국어 문자를 수용하기 위해, 입출력 라이브러리를 템플릿으로 작성
클래스 설명
ios 모든 입출력 스트림 클래스들의 기본(Base) 클래스. 스트림 입출력에 필요한 공통 함수와 상수, 멤버 변수 선언
istream,
ostream,
iostream
istream은 문자 단위 입력 스트림. ostream은 문자 단위 출력 스트림. iostream은 문자 단위로 입출력을 동시에 할 수 있는 스트림 클래스
ifstream,
ofstream,
fstream
파일에서 읽고 쓰는 기능을 가진 파일 입출력 스트림 클래스. 파일에서 읽을 때는 ifstream 클래스를, 파일에 쓸 때는 ofstream 클래스를, 읽고 쓰기를 동시에 할 때 fstream 클래스 이용


표준 입출력 스트림 객체

  • C++ 프로그램이 실행될 때 자동으로 생겨나는 스트림
    • cin
      ◼ istream타입의 스트림 객체로서 키보드 장치와 연결
    • cout
      ◼ ostream타입의 스트림 객체로서 스크린 장치와 연결
    • cerr
      ◼ ostream타입의 스트림 객체로서 스크린 장치와 연결
      ◼ 오류 메시지를 출력할 목적
      ◼ 스트림 내부 버퍼 거치지 않고 출력
    • clog
      ◼ ostream타입의 스트림 객체로서 스크린 장치와 연결
      ◼ 오류 메시지를 출력할 목적
      ◼ 스트림 내부에 버퍼 거쳐 출력

포맷 입출력

  • C++에서도 입출력 시 포맷 지정 가능
    • C 언어의 printf()와 유사
  • 포맷 입출력 방법 3 가지
    • 포맷 플래그
    • 포맷 함수
    • 조작자

포맷 플래그

  • 입출력 스트림에서 입출력 형식을 지정하기 위한 플래그
플래그 의미
ios::skipws 0x0001 입력시 공백 문자(스페이스, 탭, 개행문자)를 무시
ios::unitbuf 0x0002 출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력
ios::uppercase 0x0004 16진수의 A~F, 지수 표현의 E를 대문자로 출력
ios::showbase 0x0008 16진수이면 0x를, 8진수이면 0을 숫자 앞에 붙여 출력
ios::showpoint 0x0010 실수 값에 대해, 정수 부분과 더불어 소수점 이하의 끝자리들을 0으로 출력
ios::showpos 0x0020 양수에 대해 + 기호 출력
ios::left 0x0040 필드를 왼쪽 맞춤(left-align) 형식으로 출력
ios::right 0x0080 필드를 오른쪽 맞춤(right-align) 형식으로 출력
ios::internal 0x0100 부호는 왼쪽 맞춤으로 숫자는 오른쪽 맞춤으로 출력
ios::dec 0x0200 10진수로 출력. 디폴트 설정
ios::oct 0x0400 8진수로 출력
ios::hex 0x0800 16진수로 출력
ios::scientific 0x1000 실수에 대해 과학 산술용 규칙에 따라 출력
ios::fixed 0x2000 실수에 대해 소수점 형태로 출력
ios::boolalpha 0x4000 설정되면, 논리값 true를 "true"로, false를 "false"로 출력하고, 설정되지 않으면, 정수 1과 0으로 출력
  • 포맷 플래그를 세팅하는 멤버 함수
cout.unsetf(ios::dec); // 10진수 해제
cout.setf(ios::hex); // 16진수로 설정

cout.setf(ios::dec | ios::showpoint); // 10진수 설정, 소수점 이하 0으로 출력


조작자

  • manipulator, 스트림 조작자(stream manipulator)
  • 조작자는 함수
    ◼ C++ 표준 라이브러리에 구현된 조작자 : 입출력 포맷 지정 목적
    ◼ 개발자 만의 조작자 작성 가능 : 다양한 목적
    ◼ 매개 변수 없는 조작자와 매개 변수를 가진 조작자로 구분
  • 조작자는 항상 « 나 » 연산자와 함께 사용됨
매개변수 없는 조작자
조작자 I/O 용도
endl O 스트림 버퍼를 모두 출력하고 다음 줄로 넘어감
oct O 정수 필드를 8진수 기반으로 출력
dec O 정수 필드를 10진수 기반으로 출력
hex O 정수 필드를 16진수 기반으로 출력
left O 왼쪽 맞춤으로 출력
right O 오른쪽 맞춤으로 출력
fixed O 실수 필드를 고정 소수점 방식으로 출력
scientific O 실수 필드를 과학 산술용 방식으로 출력
flush O 스트림 버퍼 강제 출력
showbase O 16진수의 경우 0x로, 8진수의 경우 0을 앞에 붙여서 출력
noshowbase O showbase 지정 취소
showpoint O 실수 값에 대해, 정수 부분과 소수점 이하의 끝자리 이후 남은 공간을 0으로 출력
noshowpoint O showpoint 지정 취소
showpos O 양수인 경우 + 부호를 붙여 출력
skipws I 입력 스트림에서 공백 문자를 읽지 않고 건너뜀
noskipws I skipws 지정 취소
boolalpha O 불린 값이 출력될 때, "true" 혹은 "false" 문자열로 출력
매개변수를 가진 조작자
조작자 I/O 용도
resetioflags(long flags) IO flags에 지정된 플래그들 해제
setbase(int base) O base를 출력할 수의 진수로 지정
setfill(char cFill) O 필드를 출력하고 남은 공간에 cFill 문자로 채움
setioflags(long flags) IO flags를 스트림 입출력 플래그로 설정
setprecision(int np) O 출력되는 수의 유효 숫자 자리수를 np개로 설정. 소수점(.)은 별도로 카운트
setw(int minWidth) O 필드의 최소 너비를 minWidth로 지정


사용자 정의 조작자 함수 원형

  • 매개변수 없는 조작자의 경우
istream& manipulatorFunction (istream& ins)
ostream& manipulatorFunction (ostream& outs)


삽입 연산자(<<)

  • insertion operator, 삽입자라고도 부름
    ◼ << 연산자는 C++의 기본 연산자 : 정수 시프트 연산자
  • ostream 클래스에 중복 작성되어 있음
  • 사용자 삽입 연산자 만들기
    • 개발자가 작성한 클래스의 객체를 << 연산자로 출력


추출 연산자(>>)

  • extraction operator
    ◼ >> 연산자는 C++의 기본 연산자 : 정수 시프트 연산자
  • ostream 클래스에 중복 작성되어 있음
  • 추출 연산자의 실행 과정
    ◼ 삽입 연산자의 실행 과정과 유사하므로 생략
  • 사용자 추출 연산자 만들기
    • 개발자가 작성한 클래스의 객체에 >> 연산자로 입력