Search
Duplicate

11장. C++ 입출력 시스템

생성일
2022/05/09 08:20
태그
C++

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++
복사