11장. C++ 입출력 시스템
스트림
스트림 (stream)
•
데이터의 흐름, 혹은 데이터를 전송하는 SW 모듈
ex) 흐르는 시내와 유사한 개념으로 생각
•
스트림의 양 끝에는 프로그램과 장치 연결
◦
보낸 순서대로 데이터 전달
◦
입출력 기본 단위 : 바이트(byte)
C++ 스트림 종류
•
입력 스트림
◦
입력 장치, 네트워크, 파일로부터 데이터를 프로그램으로 전달하는 스트림
•
출력 스트림
◦
프로그램에서 출력되는 데이터를 출력 장치, 네트워크, 파일로 전달하는 스트림
C++ 입출력 스트림 버퍼
C++ 입출력 스트림은 버퍼를 가짐
키 입력 스트림의 버퍼
•
목적
◦
입력장치로부터 입력된 데이터를 프로그램으로 전달하기 전에 일시 저장
◦
키 입력 도중 수정 가능
▪
<Backspace> 키가 입력되면 이전에 입력된 키를 버퍼에서 지움
•
C++ 응용 프로그램은 사용자의 키 입력이 끝난 시점에서 읽음
◦
<Enter> 키 : 키 입력의 끝을 의미
◦
<Enter> 키가 입력된 시점부터 키 입력 버퍼에서 프로그램이 읽기 시작
스크린 출력 스트림 버퍼
•
목적
◦
프로그램에서 출력된 데이터를 출력 장치로 보내기 전에 일시 저장
◦
출력 장치를 반복적으로 사용하는 비효율성 개선
•
버퍼가 꽉 차거나 강제 출력 명령 시에 출력 장치에 출력
C++ 표준은 스트림 입출력만 지원
입출력 방식 2가지
•
스트림 입출력 방식 (stream I/O)
◦
스트림 버퍼를 이용한 입출력 방식
◦
입력된 키는 버퍼에 저장
▪
<Enter> 키가 입력되면 프로그램이 버퍼에서 읽어가는 방식
◦
출력되는 데이터는 일차적으로 스트림 버퍼에 저장
▪
버퍼가 꽉 차거나, ‘\n’ 을 만나거나, 강제 출력 명령의 경우에만 버퍼가 출력 장치에 출력
•
저 수준 입출력 방식 (raw level console I/O)
◦
키가 입력되는 즉시 프로그램에게 키 값 전달
▪
<Backspace> 키 그 자체도 프로그램에게 바로 전달
▪
게임 등 키 입력이 즉각적으로 필요한 곳에 사용
◦
프로그램이 출력하는 즉시, 출력 장치에 출력
◦
컴파일러마다 다른 라이브러리나 API wldnjs
▪
C++ 프로그램의 호환성이 낮음
C++ 표준은 스트림 입출력 방식만 지원
•
스트림 입출력은 모든 표준 C++ 컴파일러에 의해 컴파일 됨
•
높은 호환성
구 버전 입출력 라이브러리의 약점
•
문자를 한 바이트의 char로 처리
•
한글 문자 읽을 수 없음 → 물론 지금도 cin으로 한글을 문자 단위로는 읽을 수 없음
현재의 표준 C++ 입출력 라이브러리
•
다양한 크기의 다국어 문자를 수용하기 위해, 입출력 라이브러리가 템플릿으로 작성됨
typedef로 선언된 ios, istream, ostream, iostream 클래스
typedef basic_ios<char, char_traits<char> > ios;
typedef basic_istream<char, char_traits<char> > istream;
typedef basic_ostream<char, char_traits<char> > ostream;
typedef basic_iostream<char, char_traits<char> > iostream;
C++
복사
입출력 클래스 소개
클래스 | 설명 |
ios | 모든 입출력 스트림 클래스들의 기본(Base) 클래스, 스트림 입출력에 필요한 공통 함수와 상수, 멤버 변수 선언 |
istream,
ostream,
iostream | istream은 문자 단위 입력 스트림, ostream은 문자 단위 출려 스트림, iostream은 문자 단위로 입출력을 동시에 할 수 있는 스트림 클래스 |
ifstream,
ofstream,
fstream | 파일에서 읽고 쓰는 기능을 가진 파일 입출력 스트립 클래스, 파일에서 읽을 때는 ifstream 클래스를, 파일에 쓸 때는 ofstream 클래스를, 읽고 쓰기를 동시에 할 때 fstream 클래스 이용 |
C++ 표준 입출력 스트림 객체
→ C++ 프로그램이 실행될 때, 자동으로 생겨나는 스트림
cin
•
istream 타입의 스트림 객체로서 키보드 장치와 연결
cout
•
ostream 타입의 스트림 객체로서 스크린 장치와 연결
cerr
•
ostream 타입의 스트림 객체로서 스크린 장치와 연결
•
오류 메시지를 출력할 목적
•
스트림 내부 버퍼 거치지 않고 출력
clog
•
ostream 타입의 스트림 객체로서 스크린 장치와 연결
•
오류 메시지를 출력할 목적
•
스트림 내부에 버퍼 거쳐 출력
istream cin
ostream cout
ostream cerr
ostream clog
C++
복사
ostream 멤버 함수
ostream& put(char ch) // ch의 문자를 스트림에 출력
ostream& wirte((char* str, int n) // str 배열에 있는 n개의 문자를 스트림에 출력
ostream& flush() // 현재 스트림 버퍼에 있는 내용 강제 출력
C++
복사
예제 11-1) ostream 멤버 함수를 이용한 문자 출력
#include <iostream>
using namespace std;
int main() {
// "Hi!" 를 입력하고 다음 줄로 넘어간다
cout.put('H');
cout.put('i');
cout.put(33); // 아스키코드 33은 '!' 문자이다
cout.put('\n');
// "C++ "을 출력한다
cout.put('C').put('+').put(' ');
// put 메소드를 연결하여 사용할 수 있다
char str[] = "I love you programming";
cout.write(str, 6);
// str 배열의 6개의 문자 "I love"를 스트림에 출력
}
C++
복사
istream 멤버 함수 - 문자 입력, get() 함수
int get()
// 입력 스트림에서 문자를 읽어 리턴, 오류나 EOF를 만나면 -1(EOF) 리턴
istream& get(char& ch)
// 입력 스트림에서 문자를 읽어 ch에 저장,
// 현재 입력 스트림 객체(*this)의 참조 리턴,
// 오류나 EOF를 만나면, 스트림 내부의 오류 플래그(failbit) 세팅
C++
복사
•
int get() 을 이용하여 한 라인의 문자들을 읽는 코드
int ch;
while((ch = cin.get()) != EOF) { // EOF는 -1
cout.put(ch); // 읽은 문자 출력
if (ch == '\n')
break; // <Enter> 키가 입력되면 읽기 중단
}
C++
복사
•
istream& get(char& ch) 을 이용하여, 한 라인의 문자들을 읽는 코드
char ch
while (true) {
cin.get(ch); // 입력된 키를 ch에 저장하여 리턴
if (cin.eof()) break; // EOF를 만나면 읽기 종료
C++
복사