std::ios::rdbuf()
일부 derived stream class(stringstream or fstream 등)는 객체 생성 시에 associated 된 internal stream buffer를 가진다. rdbuf는 stream의 associated stream buffer를 변경하는 함수로, stream buffer 자체에는 아무련 영향을 주지 않는다.
cin/ifstream, 혹은 cout/ofstream 등, 서로 다른 두 stream을 한 스트림에서 다른 스트림으로 리디렉시키는데 사용한다. 예를 들어 어떤 프로그램에서 input을 console과 cin을 통해 입력받는데, input을 입력받는 코드 부분을 수정하지 않고 file stream을 통해서 입력을 받도록 프로그램을 수정하고 싶을 때 유용하게 사용할 수 있다.
(1) streambuf* rdbuf() const;
(2) streambuf* rdbuf(streambuf* sb);
(1) accessor. 현재 stream의 associated streambuf의 포인터를 리턴.
(2) mutator. 현재 stream의 associated streambuf를 sb로 바꾸고 stream의 error state flags를 초기화. 이전 associated streambuf의 포인터를 리턴.
예제
#include <iostream> | |
#include <fstream> | |
using std::cin; | |
using std::cout; | |
using std::endl; | |
void main() | |
{ | |
int val1, val2, val3; | |
// Take input from file stream | |
std::ifstream ifs; | |
ifs.open("test.txt"); | |
// Associate new stream buffer with cin | |
std::streambuf * backupBuffer = cin.rdbuf(); | |
cin.rdbuf(ifs.rdbuf()); | |
//std::streambuf * backupBuffer = cin.rdbuf(ifs.rdbuf()); // 가능 | |
// Take input from standard input stream | |
cin >> val1 >> val2 >> val3; | |
cout << val1 << ", " << val2 << ", " << val3 << endl; | |
cin.rdbuf(backupBuffer); | |
ifs.close(); | |
return; | |
} |