서로 연결된 스트림이 있다.

 스트림에서 사용하는 버퍼들이 서로 연결되어 있는 것이 있다. 예를 들어, cin이 수행될 때 cout의 버퍼가 비워진다던지 하면 cin과 cout의 스트림은 서로 연결되었다고 할 수 있다. 파일 ios.h를 살펴보면 tie 메소드가 제공되는 것을 볼 수 있다.이 tie 메소드를 이용하면 어떻게 연결되어 있는지 알 수 있다. 예를 들어, cin과  cout 사이가 연결되어 있는지 체크해 보려면 다음과 같이 실행하도록 한다.

 if(*(cin.tie()) == cout)

 만일 연결되어 있다면 if 구문은 참이 될 것이다. tie 메소드로 연결을 확인할 수도 있지만 직접 연결을 시도할 수도 있다. 예를 들어, 버퍼 스트림을 사용한다면 스트림 속의 버퍼가 차야 연산이 수행될 텐데, 이때 다른 스트림과 연결되어 있다면 해당 스트림이 수행될 때 버퍼가 비워질 것이다.

 그러면 아래의 예제를 보자. 아래는 화면 콜솔을 ofstream 으로 설정을 하였고, cin과 tie 메소드를 이용하여 연결을 맺었다.

 // 콘솔을 사용하기 위해 ofstream 설정
ofstream console(“CON”);
// console과 cin을 연결
cin.tie(&console);

 이 상태에서는 다음과 같은 문장을 실행시키면 console에 문장이 들어갈 것이다. 하지만 아직 console에 있는 문장이 화면에 출력되지는 않는다.

 // 콘솔에 문장을 출력
 console << “콘솔에 문장 입력!”;

 이 상태에서 cin과 관련된 작업이 수행되면 console에 있는 버퍼가 비워지면서 화면에 출력이 이루어진다.

cin.get();
console.close(); 

한 문자씩 버퍼에 출력하는 put 메소드

 출력 스트링 스트림에서도 put 메소드를 이용하여 버퍼에 하나의 문자식 입력할 수 있다. 간단한 예를 보면 다음과 같다.

#include <strstrea>
/* 우분투 10.04, g++-4.3.3 버전에서는 다음의 헤더파일을 사용하도록 한다.
 * #include <iostream>
 * #include <backward/strstream>
*/

using namespace std;

void main(void)
{
  ostrstream intStream;
  char intData = ‘0’;

  // 1~10 까지 숫자와 공백을 버퍼에 출력
  for(int count = 0; count < 10; count++, intData++) {
    intStream.put(intData);
    intStream.put(‘ ‘);
    if(intStream.fail()) {
      cerr << “버퍼로의 출력 에러 발생” << endl;
      return;
    }
  }

  // 마지막에 NULL 문자 입력후 화면에 출력
  intStream << ends;
  cout intStream.rdbuf() << endl;
}

출력 스트림에서 한문자씩 출력하기.

 cin 이 제공하는 메소드 중 하나의 문자를 입력받는 get 메소드가 존재하는 것처럼 cout에는 하나의 문자를 출력하는 put 메소드가 존재한다. put 메소드의 사용에는 제약이 따르게 되는데, 이는 put 메소드에서 사용 가능한 파라미터는 단지 하나의 문자(character)뿐이라는 것이다.

 물론 숫자를 넘길 수도 있는데, 이 또한 내부에서 문자로 변환하여 화면에 출력하게 된다. 예를 들어 다음을 실행시켜 보자.

int letter = 65;
cout.put(letter);

char clet = ‘B’;
cout.put(clet);

 위의 명령을 실행시키면 화면에 A와 B가 출력된다. put 메소드는 하나의 문자만을 입력받고 출력하는 작업이 반복적으로 이루어져야 하는 경우에 유용하게 사용할 수 있을 것이다.