1.7.4 일반적인 스트림 개념
스트림은 화면, 키보드 및 파일에만 국한하지 않는다. 모든 클래스는 istream, ostream, iostream에서 파생할 경우* 스트림으로 사용할 수 있으며 해당 클래스의 함수에 대한 구현을 제공한다. 예를 들어 Boost.Asio는 위의 I/O에 대한 대안으로 TCP/IP 및 Boost.IOStream 스트림을 제공한다. 표준 라이브러리에는 출력 가능한 모든 타입의 문자열을 만드는데 사용할 수 있는 stringstream을 포함하고 있다. stringstream의 메소드 str()은 스트림의 내부 문자열을 반환한다.
ostream의 레퍼런스를 인수로 사용해 모든 종류의 출력 스트림을 허용하는 출력 함수를 작성할 수 있다.
#include <iostream> #include <fstream> #include <sstream> void write_something(std::ostream& os) { os << "Hi stream, did you know that 3 * 3 = " << 3 * 3 << std::endl; } int main(int argc, char* argv[]) { std::ofstream myfile("example.txt"); std::stringstream mysstream; write_something(std::cout); write_something(myfile); write_something(mysstream); std::cout << "mysstream is: " << mysstream.str(); // 개행을 포함하고 있다. }
마찬가지로 iostream을 사용해 일반적인 입력을 istream 및 읽기/쓰기 I/O로 구현할 수 있다.
* 클래스를 파생하는 방법은 6장에 나와 있다. std::ostream에서 출력 스트림을 파생함으로써 기술적으로 실현된다는 것을 주목하라.