cout 과 ofstream 으로 동시 출력해주는 stream 을 정의하려면?
글쓴이: jinserk / 작성시간: 금, 2011/05/27 - 7:39오후
안녕하세요..
A, B, C, ... 등등을 출력스트림으로 뽑아야 하는데, 파일과 화면에 둘다 보여지게 하고 싶습니다.
기왕하는거 좀더 OO 적으로 해보고 싶어서 logstream 을 하나 만들고 싶은데요.
화면에 찍거나 파일에 찍거나 하는걸 선택할 수 있도록요.
처음엔 ofstream 을 상속해서 만들어 보려고 했더니 엄청난 에러가 쏟아지네요.
검색을 해보니 ostream 을 상속받지 말라는 말도 보이구요.
그래서 ofstream 객체를 포함하는 log 클래스를 정의하고 operator<< 를 정의해주는 식으로 갔는데,
이렇게 하면 logfs << A << B 와 같은 모양으로 쓸수는 있지만
print(ostream& os) 와 같은 형태의 함수에 인자로 넣을 수가 없습니다.
ostream 속성을 가지면서 cout 과 ofstream 으로 동시 출력하는 클래스를 어떻게 만드는게 정석인가요?
감사합니다.
Forums:


오래 되서 잘 기억은 안나지만 streambuf
오래 되서 잘 기억은 안나지만 streambuf 계층에서 처리해주는 게 정석이었던 것 같군요.
감사합니다. 그런데, 어차피 streambuf를
감사합니다.
그런데, 어차피 streambuf를 상속해서 logstreambuf 를 정의하고 이걸 포함하는 ostream 상속 객체를 만든다고 해도, 내부 streambuf 가 하나밖에 없을 텐데, cout 과 filebuf 를 동시에 건드려줄 수 있나요?
제가 잘 이해를 못하는 건지..
Leo.
5 #ifndef __LOGSTREAM_H__
5 #ifndef __LOGSTREAM_H__ 6 #define __LOGSTREAM_H__ 7 8 #include <streambuf> 9 #include <fstream> 10 11 namespace mylib { 12 13 class logstreambuf : public std::streambuf 14 { 15 typedef std::char_traits<char> traits_type; 16 typedef traits_type::int_type int_type; 17 18 private: 19 std::streambuf* sb1_; 20 std::streambuf* sb2_; 21 bool sb2_en_; 22 23 public: 24 logstreambuf() : sb1_(NULL), sb2_(NULL) {} 25 logstreambuf(std::streambuf* sb1, std::streambuf* sb2) 26 : sb1_(sb1), sb2_(sb2) {} 27 28 void init(std::streambuf* sb1, std::streambuf* sb2) 29 { 30 sb1_ = sb1; 31 sb2_ = sb2; 32 } 33 34 protected: 35 int_type overflow(int_type c) 38 { 39 if (!traits_type::eq_int_type(c, traits_type::eof())) { 40 c = sb1_->sputc(c); 41 if (!traits_type::eq_int_type(c, traits_type::eof())) 42 c = sb2_->overflow(c); 43 return c; 44 } 45 else 46 return traits_type::not_eof(c); 47 } 48 49 int sync() 50 { 49 int rc = sb1_->sync(); 50 if (rc != -1) 51 rc = sb2_->sync(); 52 return rc; 53 } 54 55 }; // class logstreambuf 56 57 class logstream : public std::ostream 58 { 59 private: 60 std::ofstream ofs_; 61 logstreambuf buf_; 62 63 public: 64 logstream() : std::ios(0), std::ostream(&buf_) {} 65 logstream(char* filename) : std::ios(0), std::ostream(&buf_) 66 { 67 buf_.init(ofs_.rdbuf(), std::cout.rdbuf()); 68 open(filename); 69 } 70 71 void open(char* filename) 72 { 73 ofs_.open(filename); 74 } 75 76 }; // class logstream 77 78 }; // namespace mylib 79여기까진 만들었는데.. 막상 아래와 같은 에러가 나네요.
뭐.. streambuf 의 멤버함수 overflow 와 sync 가 protected 이니 당연하긴 한데..
대체 streambuf 안에 두개의 서로 다른 sreambuf 를 어떻게 넣어야 하는건지 전혀 감을 못잡겠습니다. :(
조언 부탁드립니다.
댓글 달기