gpt4 book ai didi

c++ - 如何覆盖 std::filebuf?

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:13 25 4
gpt4 key购买 nike

我有一个使用 STLPort 5.2.1 的 Visual Studio 2008 C++ 03 应用程序,我想在其中使用自定义 std::filebuf执行。例如:

class MyFileBuf : public std::filebuf
{
protected:
virtual int_type sync()
{
// breakpoint here never fires
return std::filebuf::sync();
};

virtual std::streamsize xsputn( const char_type* p, std::streamsize n )
{
// breakpoint here never fires
return std::filebuf::xsputn( p, n );
};

virtual int_type overflow( int_type c = traits_type::eof() )
{
// breakpoint here never fires
return std::filebuf::overflow( c );
};
};

class MyFileStream : public std::ofstream
{
public:
MyFileStream() : std::ofstream( new MyFileBuf() ) { clear(); };
~MyFileStream() { delete rdbuf(); };
};

int main()
{
MyFileStream fs;
fs.open( "test.txt" );
fs << "this is a test" << std::endl;
return 0;
}

不幸的是,MyFileBuf 的成员都没有被调用过。如果我单步执行代码,我会看到 <<运算符(operator)去

stlpd_std::basic_streambuf<char,stlpd_std::char_traits<char> >::xsputn(const char* __s, long int __n)
stlpd_std::basic_streambuf<char,stlpd_std::char_traits<char> >::sputn(const char* __s, long int __n)
stlpd_std::basic_ostream<char,stlpd_std::char_traits<char> >::_M_put_nowiden(const char* __s)
stlpd_std::operator<<<stlpd_std::char_traits<char> >(stlpd_std::basic_ostream<char,stlpd_std::char_traits<char> >& , const char* __s )
main()

我希望调用堆栈顶部的位置:

MyFileBuf::xsputn(const char* p, long int n)

但是,这些文件是正确写入的。谁能帮助我了解我哪里出错了?

最佳答案

感谢@jahhaj 和@DanielKO 的帮助。

解决方案似乎是这样的:

#include <iostream>
#include <fstream>
using namespace std;

class MyFileBuf : public std::filebuf
{
protected:
virtual int_type sync()
{
return std::filebuf::sync();
};

virtual std::streamsize xsputn( const char_type* p, std::streamsize n )
{
return std::filebuf::xsputn( p, n );
};

virtual int_type overflow( int_type c = traits_type::eof() )
{
return std::filebuf::overflow( c );
};
};

class MyFileStream : public std::ostream
{
public:
MyFileStream() : std::ostream( 0 ) { init( &buf_ ); };
MyFileStream( const char* filename, std::ios_base::openmode mode = std::ios_base::out )
: std::ostream( 0 )
{
init( &buf_ );
this->open( filename, mode );
}

bool is_open() const { return buf_.is_open(); };

void close() { buf_.close(); };

void open( const char* filename, std::ios_base::openmode mode = std::ios_base::out )
{
buf_.open( filename, mode );
};

std::filebuf* rdbuf() { return &buf_; };

private:
MyFileBuf buf_;
};

int main()
{
MyFileStream fs( "test.txt" );
fs << "this is a test" << std::endl;
return 0;
}

Example

关于c++ - 如何覆盖 std::filebuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com