gpt4 book ai didi

c++ - 为什么这个流缓冲区不工作?

转载 作者:行者123 更新时间:2023-11-30 02:48:17 26 4
gpt4 key购买 nike

我有一个非常简单的流缓冲区设置,用于将字节从流转发到缓冲区。当我打印时,我得到一个奇怪的输出,即 "HellHelllo," 而不是 "Hello"。可能是我眼睛累了,但是我找不到这里的问题。为什么我得到的是输出?

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>

class io_buffer : public std::streambuf
{
public:
io_buffer(std::istream& is, int buf_size = 4)
: size(buf_size) , is_(is) , buffer(std::max(buf_size, 1))
{
char* end = &buffer.front() + buffer.size();
setg(end, end, end);
}

int_type underflow()
{
if (gptr() < egptr())
return traits_type::to_int_type(*gptr());

if (is_)
{
std::copy_n(std::istreambuf_iterator<char>(is_),
size, std::back_inserter(buffer));

char* beg = &buffer.front();
setg(beg, beg, beg + buffer.size());
return traits_type::to_int_type(*gptr());
}
return traits_type::eof();
}
private:
int size;
std::istream& is_;
std::vector<char> buffer;
};

int main()
{
std::istringstream oss("Hello, World");
io_buffer buf(oss);

std::istream is(&buf);
std::string str;

is >> str;
std::cout << str << std::endl; // "HellHelllo,"
}

最佳答案

你用(可能是 4 个)零初始化缓冲区

buffer(std::max(buf_size, 1))

并在不清除缓冲区的情况下将内容附加到缓冲区。

您可以将其更改为:

int_type underflow()
{
if (gptr() < egptr())
return traits_type::to_int_type(*gptr());

if (is_)
{
char* beg = buffer.data();
char* end = std::copy_n(
std::istreambuf_iterator<char>(is_),
size, beg);
setg(beg, beg, end);
return traits_type::to_int_type(*gptr());
}
return traits_type::eof();
}

这里还有一个错误:std::copy_n 可能要求输入太多字符。

制作它:

int_type underflow()
{
if (gptr() < egptr())
return traits_type::to_int_type(*gptr());

if (is_)
{
char* beg = buffer.data();
char* end = beg;
char* limit = beg + buffer.size();
std::istreambuf_iterator<char> in(is_);
std::istreambuf_iterator<char> eos;
for( ; end < limit && in != eos; ++end, ++in)
*end = *in;
setg(beg, beg, end);
if(beg < end)
return traits_type::to_int_type(*gptr());
}
return traits_type::eof();
}

并消除成员大小。

关于c++ - 为什么这个流缓冲区不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109905/

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