스트림 출력


I/O 스트림(stream)

- C 에서는 stdio.h 에 의해서 입출력 함수들이 제공되었으나 C++ 에서는
iostrem.h에 의해 제공되는 객체를 사용하여 스트림들을 제어한다. 이
헤더파일 안에는 istream, ostream등 하드웨어와 밀접한 여러가지 클래
스들이 속해있고 상속을 통해서 여러가지 기능을 제공한다. 관련서적을
찾아보면 클래스의 계승도가 나와있다.

## 스트림 출력 ##

- cout과 <<연산자
- cout은 출력을 담당하는 객체이며 <<연산자를 이용한다. <<연산자
는 헤더파일인 iostream.h 에 의해서 오버로딩되어 출력의 기능을 발
휘한다. cout은 변수들의 데이터형을 스스로 알아서 판단하여 적당히
출력한다.

[ 형식 ]
cout <<변수 <<변수 <<...;

- cout의 멤버함수들
- put 함수 : 문자형 데이터를 출력한다.

[ 프로토타입 ]
ostream &ostream::put(char ch);
[ 사용법 ]
cout.put(char);

- write함수 : 문자열 데이터를 출력한다.

[ 프로토타입 ]
ostream &ostream::write(const char *str, int size);
ostream &ostream::write(const unsigned char *str, int size);
[ 사용법 ]
cout.write(str,size);

출력은 보통 문자열 전체를 하므로 size자리에는 대게 sizeof(str)이
오게 되어있다.

- 폭(width) 지정, fill지정

다음의 멤버함수들을 이용..

cout.width(지정하고자 하는 폭);
cout.fill(fill문자); // 폭을 전부 이 문자로 채움

width는 ios클래스 안에 있으므로, 다음과 같이도 사용가능.

int ios::width(int w); // 폭을 w로 정하고 과거의 폭을 리턴
int ios::width(); // 현재의 폭을 리턴

하나의 데이터를 출력할 때마다 폭과 fill은 초기값이 되버리므로 매
번 다시 지정해주어야 한다. 필드의 폭이 데이터의 길이보다 적으면
폭을 무시하고 자리넘침이 발생한다. C의 printf함수와 동일하다.

- 출력 포맷의 지정
- ios클래스에는 현재의 포맷상태를 지정하고 있는 플래그들이 있다.

enum{
skipws = 0x0001, // skip whitspace on input
left = 0x0002. // left-adjust output
right = 0x0004, // right-adjust output
internal = 0x0008, // padding after sign or base indicator
dec = 0x0010, // decimal conversion
oct = 0x0020, // octal conversion
hex = 0x0040, // hexadecimal conversion
showbase = 0x0080, // use base indicaor on output
showpoint = 0x0100, // force decimal point(floating output)
uppercase = 0x0200, // upper-case hex output
showpos = 0x0400, // add '+' to positive
scientific = 0x0800, // use 1.234E2 floating notaion
fixed = 0x1000, // use 123.45 floating notaion
unitbuf = 0x2000, // flush all streams after insertion
stdio = 0x4000, // flush stdout, stderr after insertion
}

이들을 조작하기 위해서는 다음 멤버함수들을 이용한다.

- flags 함수

long ios::flags(); // 포맷상태플랙을 읽는다.
long ios::flags(long f); // 포맷상태플랙을 세트한다.

flags를 이용하여 세트하는 경우 비트연산자를 이용한다.

cout.flags(cout.flags()&~ios::skipws); //swipws off
cout.flags(cout.flags()|ios::uppercase); //uppercase on

- setf/unsetf 함수

setf/unsetf는 플래그를 set/unset시키는 함수이다.

cout.setf(ios::skipws); // skipws on
cout.unsetf(ios::uppercase); // uppercase off

setf함수는 인자가 1개이냐 2개이냐에 따라서 각기 다른 기능을 수행
한다. 이러한 경우에는 다음과 같이한다.

long ios::setf(long s1,long s2);

s2의 값에 1인 비트의 값을 s1의 해당비트에서 읽어온다. s2는 수정
되는 비트 s1은 수정될 것에 대한 지시이다.

- 포맷속성 중에는 동시에 쓰일 수없는 것들이 있는데, 이럴 경우를 위
해 ios에는 다음과 같은 enum상수가 마련되어 있다.

basefiled = dec | oct | hex
adjustfield = left|reght | center
floatfield = scientific | fixed

basefield의 경우 각 비트가 모두 1로 세트되어 있다. 이것을 이용해
서 10진수를 선택한다면

cout.setf(ios::dec,ios::basefield);등과 같은 방법으로.

- 조작자(manipulator)
- iomanip.h 안의 조작자(manipulator)들을 이용하면 비교적 쉽게 출력
포맷을 지정할 수 있다. 조작자란 입출력 형식을 조작하 것들이다.


조 작 자 동 작
─────────────────────────────
dec 10진수로 입출력을 행함
hex 16진수로 입출력을 행함
oct 8진수로 입출력을 행함
endl 개행문자를 출력('\n')
ends NULL문자를 출력('\0')
ws 화이트스페이스 제거
flush 현재 스트림의 내용을 비움
(버퍼내용의 강제적 출력)
setbase(int) 진법을 지정, (n=8,10,16)
이외의 숫자가 오면 10진수로 가정함
resetiosflags(long n) n에서 지정한 비트를 reset한다.
setiosflags(long n) n과 x_flags를 OR시켜
n에서 지정한 비트를 set한다.
setfill(char) cout.fill(char)과 동일
setw(int) cout.width(int)와 동일
setprecision(int) 실수의 유효숫자 자리수 지정
지정한 유효숫자 자리에서 반올림됨
─────────────────────────────

※ 주의 : 인자가 없는 것들은 ()기호조차 하지 않는다.
setfill(), setw()함수등은 cout.width(),fill에 비해 >>연산
자와 함께 쓰일 수 있다.

Ex)
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>

void main(void)
{
char str[]="string";

clrscr();

cout.setf(ios::left);
cout <<setw(10) <<str <<endl;
cout.setf(ios::right);
cout <<setw(10) <<str <<endl;
cout.setf(ios::hex);
cout.setf(ios::showbase);
cout.setf(ios::left);
cout.setf(ios::uppercase);
cout <<setw(10) <<12 <<endl;
}