2016-11-13 4 views
0
#undef _HAS_EXCEPTIONS 
#define _HAS_EXCEPTIONS 0 

#include <stdio.h> 
#include <streambuf> 
#include <ostream> 
#include <iostream> 
#include <fstream> 

using namespace std; 


class MyIoStream : public std::basic_iostream< char, std::char_traits<char> > 
{ 
public: 
    class MyBuffer : public std::basic_streambuf<char, std::char_traits<char> > 
    { 

    public: 
     streamsize __CLR_OR_THIS_CALL xsputn(const char *_Ptr, 
      streamsize _Count) 
     { 
      par->clear(); 
      par->setstate(ios_base::goodbit); 
      printf("write\n"); 
      return _Count; 
     } 
     streamsize __CLR_OR_THIS_CALL _Xsgetn_s(char * _Ptr, 
      size_t _Ptr_size, streamsize _Count) 
     { 
      par->clear(); 
      par->setstate(ios_base::goodbit); 
      a = a + 1; 
      if(a == 2) 
       throw "asdf"; 
      printf("read\n"); 
      return _Count; 
     } 
     MyIoStream* par; 
     int a; 
    }; 
public: 

    MyIoStream() : 
    std::basic_iostream< char, std::char_traits<char> >(&buf) 
    { 
     buf.par = this; 
     buf.a = 0; 
    } 

private: 

    MyBuffer buf; 

}; 

void MyRead(istream* pIs, int siz, void* buf) 
{ 
    try 
    { 
     pIs->read((char*)buf, siz); 
    } 
    catch(char*) 
    { 
     printf("my catch\n"); 
    } 
} 

void MyWrite(ostream* pOs, int siz, void* buf) 
{ 
    pOs->write((const char*)buf, siz); 
} 

int main(void) 
{ 
    MyIoStream o; 
    char buf[1234]; 

    MyRead((istream*)&o, 10, buf); 
    MyWrite((ostream*)&o, 10, buf); 
    MyWrite((ostream*)&o, 10, buf); 
    MyRead((istream*)&o, 10, buf); 
    MyRead((istream*)&o, 10, buf); 
    MyWrite((ostream*)&o, 10, buf); 
    MyRead((istream*)&o, 10, buf); 
    MyRead((istream*)&o, 10, buf); 

    return 0; 
} 

std :: iostreamから継承したクラスMyIoStreamを実装しようとしています。 オーバーライドされた関数MyBuffer :: xsputnとMyBuffer :: _ Xsgetn_sは例外をスローします。自分自身をキャッチする必要がありますが、スローされる例外は基本クラスによってキャッチされます。std :: iostreamを無効にする方法読み取りと書き込み時にキャッチしよう

答えて

0

MyBuffer :: xsputnの内部またはMyBuffer :: _ Xsgetn_sの内部で例外をキャッチすると仮定すると、try-catchブロック内のメソッド内でコードをラップすることができます。

私自身のカスタムLogFileクラスでは、std :: streambufから継承し、cout.rdbuff(...)を使用してostreamがどこに行くかをリダイレクトします。ただし、クラスが終了した後でポインタをデフォルトのstreambuffに戻す必要があります。

class Logger : public std::streambuf 
{ 
public: 
    std::streamsize xsputn (const char* s, std::streamsize n) 
    { 
     /* Your Code Here */ 
    } 

    template <typename T> 
    friend Logger& operator<<(Logger& logger, const T& v); 

    Logger() 
    { 
     m_pPrevStreamBuffer = cout.rdbuf(this); 
    } 

    virtual ~Logger(); 
    { 
     cout.rdbuf(m_pPrevStreamBuffer); 
    } 

private: 
    std::streambuf* m_pPrevStreamBuffer; 
    String m_CurrentLine; 
}; 
+0

クラスMyBufferのオブジェクトは、直接外部には使用されません。あなたが見ることができるように、読み書きは外部で呼び出され、内部のMyBuffer :: _ Xsgetn_sとMyBuffer :: xsputnが呼び出されます。 – sainimu78

関連する問題