C++ 什么';这个流缓冲区怎么了?

C++ 什么';这个流缓冲区怎么了?,c++,C++,我的溢出()有什么问题吗。当我打印oss.str()时,它会打印“Hello,Wor”,而不是“Hello,World”。我做错了什么 #包括 #包括 #包括 #包括 类io_缓冲区:公共标准::streambuf { 公众: io_缓冲区(标准::ostream&os,int buf_size=4) :操作系统(操作系统),缓冲区(基本单位大小) { os_.clear(); char*beg=buffer.data(); setp(beg,beg+buffer.size()); } int_

我的
溢出()有什么问题吗。当我打印
oss.str()
时,它会打印
“Hello,Wor”
,而不是
“Hello,World”
。我做错了什么

#包括
#包括
#包括
#包括
类io_缓冲区:公共标准::streambuf
{
公众:
io_缓冲区(标准::ostream&os,int buf_size=4)
:操作系统(操作系统),缓冲区(基本单位大小)
{
os_.clear();
char*beg=buffer.data();
setp(beg,beg+buffer.size());
}
int_类型溢出(int_类型c)
{
如果(操作系统&&!traits_type::eq_int_type(c,traits_type::eof()))
{
*pptr()=traits_type::to_char_type(c);
pbump(1);
if(flush())
{
setp(buffer.data(),buffer.data()+buffer.size());
返回c;
}否则
返回字符类型::eof();
}
返回特征类型::非eof(c);
}
bool flush()
{
返回os.write(pbase(),pptr()-pbase());
}
int sync()
{
回流冲洗()?0:-1;
}
私人:
标准::奥斯特雷姆和奥斯特雷姆;
向量缓冲区;
};
int main()
{
std::ostringstream oss;
io_缓冲区buf(oss);
标准::奥斯特雷姆操作系统(&buf);
string str(“你好,世界”);

os您还需要刷新一个
std::vector
(缓冲区),即:

int_类型溢出(int_类型c)
{
如果(操作系统&&!traits_type::eq_int_type(c,traits_type::eof()))
{
*pptr()=traits_type::to_char_type(c);
pbump(1);
if(flush())
{

buffer.clear();//问题在于您使用了:

setp(beg, beg + buffer.size());
在overflow()中添加新元素时不需要重新分配,结束指针应该可以访问(如果不想重新分配),否则需要在overflow()中重新分配缓冲区。因此将其更改为:

setp(beg, beg + buffer.size() - 1);
输入输出缓冲区构造函数

稍后在溢出中,将setp更改为:

pbump(-(pptr() - pbase()));
还要刷新缓冲区,请添加endl:

os << str << endl;

os+1回答得好。你让他走上了正确的轨道,但最好是执行
pbump(-buffer.size())
而不是清除缓冲区,因为这样可以避免多次调用
overflow()
。如果缓冲区没有大小,则必须为每个输出操作调用
overflow()
。)
os << str << endl;