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を無効にする方法読み取りと書き込み時にキャッチしよう
クラスMyBufferのオブジェクトは、直接外部には使用されません。あなたが見ることができるように、読み書きは外部で呼び出され、内部のMyBuffer :: _ Xsgetn_sとMyBuffer :: xsputnが呼び出されます。 – sainimu78