2016-11-13 1 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; 
} 

Я пытаюсь внедрить класс MyIoStream, унаследованный от std :: iostream. Перевернутая функция MyBuffer :: xsputn и MyBuffer :: _ Xsgetn_s генерирует исключения, мне нужно поймать себя, но созданное исключение вызывается базовым классом.Как отключить std :: iostream try catch при чтении и записи

ответ

0

Предполагая, что вы хотите поймать исключение внутри MyBuffer :: xsputn или внутри MyBuffer :: _ Xsgetn_s, вы можете обернуть код внутри метода в блок try-catch.

В моем собственном классе LogFile я наследую от std :: streambuf и перенаправляю туда, куда идет ostream, используя cout.rdbuff (...). Вы должны вернуть указатель на 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