stream: 입출력 데이터 흐름.
I/O를 다루려면 stream을 프로그램과 destination 각각에 연결하면 된다.
buffer란 정보 전송률의 차이를 극복하고, disk 접근 횟수를 줄여 속도를 높여준다.
예를들어, disk에서 input을 받는다면 disk에선 512byte이상 블록단위로 data를 전송하는데 프로그램은 1byte씩밖에 처리하지 못한다.
buffer는 이 둘 사이에 껴서 disk로부터 정보를 읽어오고, 프로그램은 이 buffer에서 읽어온다.
buffer가 없다면 프로그램이 매번 1byte씩 disk에 접근해야하는데, disk 접근은 memory 접근보다 속도가 느리다.
buffer를 다 채운 후 disk로 데이터를 옮기는데, 이를 flushing the buffer이라 한다
ios_base
⬇
ios
⬇
ostream, istream
⬇ ⬇
iostream
iostream에는 8개의 stream object가 포함되어 있다.
– cin, cout, cerr, clog – char
– wcin, wcout, wcerr, wclog – wchar_t
화면 출력시엔 buffer에 쌓기만 하면 안된다.
("입력하세요:" 같은걸 출력하기위해 512bytes를 채우는게 낭비임)
이럴땐 buffer을 채울때까지 기다리지않고 (1)new-line character가 들어오면 buffer는 자동으로 비워진다.
혹은 (2)즉시 입력을 받아야하는 경우도 buffer는 자동으로 비워진다.
cout<<"입력하세요: ";
cin>>num;
이때 output buffer가 비워지지 않는다면, 프로그램은 메시지 출력없이 입력만 기다릴 것이다.
flush나 endl maipulator을 사용할 수도 있다.
전자는 버퍼를 비우고, 후자는 버퍼를 비우고 new-line character도 삽입한다.(그래서 '\n'보다 느리네..)
1. 진수(hex, dec, oct)
hex(cout); cout << 169; // a9
dec(cout); cout << 169; // 169
oct(cout); cout << 169; // 251
2. width, fill
cout.width(12); width를 12로 설정한다.
cout.fill('*'); 빈칸을 '*'로 채운다.

3. precision
소수점 아래 자릿수를 정해준다.
double a = 12345.6789;
double b = 12.34;
cout.precision(3);
cout << a << endl; //12345.678
cout << b << endl; //12.34
소수점을 다 나타내는 방법
double a = 12.0
double b = 12.345
cout.setf(ios_base::showpoint)
cout.precision(2);
cout << a << endl; //12.00
cout << b << endl; //12.34
precision이나 width, fill 같은 함수는 위 manipulators처럼 cout에 바로바로 못쓰인다.
cout<< hex << 15; 이런식의 사용이 불가능하고 따로 함수호출해서 지정해야함.
이게 불편할 수 있는데, 이런 애들이 바로 cout에 연결해 사용할 수 있도록 추가 manipulators를 제공하는 iomanip header file가 있다.
setw(), setprecision(), setfill() 같은 함수들을 가지고 있다.
cout.width(6) <-> cout << setw
cout << setw(6) << "N";
#include <iostream>
#include <iomanip>
#include <cmath>
int main()
{
using namespace std;
cout << fixed << right;
cout << setw(6) << setfill('.') << n << setfill(' ')
}