gpt4 book ai didi

c++ - 自定义 std::fstream、std::filebuf 的上溢和下溢函数不会为每个字符调用

转载 作者:行者123 更新时间:2023-12-01 12:47:44 25 4
gpt4 key购买 nike

我正在尝试制作一个自定义的 std::fstream,它会在读取时对数据进行编码/解码。

template <class T>
class _filebuf : public std::filebuf {
public:
using transform_type = T;

int_type underflow() override {
auto c = std::filebuf::underflow();
return c < 0 ? c : transform.decode(c);
}

int_type overflow(int_type c) override {
return c < 0 ? c : std::filebuf::overflow(transform.encode(c));
}

private:
transform_type transform;
};

template <class T>
class _fstream : public std::iostream {
public:
using buffer_type = _filebuf<T>;

explicit _fstream(const std::string& path, std::ios::openmode openmode)
: std::iostream(0)
{
this->init(&buffer);
buffer.open(path, openmode);
}

private:
buffer_type buffer;
};
这是一个用法示例:
class _transform {
public:
template <class T>
T encode(T value) const {
return value - 1;
}

template <class T>
T decode(T value) const {
return value + 1;
}
};

int main() {
_fstream<_transform> ofs("test.txt", std::ios::out | std::ios::trunc);
ofs << "ABC"; // outputs "@BC" to the file (@ is 64 in ASCII, so only first character encoded properly)

_fstream<_transform> ifs("test.txt", std::ios::in);
std::string s;
ifs >> s; // inputs "ABC" when "@BC" was in the file so again only first character is decoded

// ...
};
经过我自己的研究,我发现 “溢出”函数在该过程中被调用两次(使用 65 和 -1 ,其中 -1 可能是 EOF),和 “下溢”也是两次(使用 64 和 -1 )。由于其他字符没有丢失,它们可能会在不调用这些函数的情况下以某种方式进行处理。
为什么会发生这种情况以及如何改变它?

最佳答案

std::streambuf<CharT,Traits>::underflow 确保 至少一个 字符在获取区域可用,有效实现 std::filebuf将始终尝试将完整缓冲区的字符读入获取区域。除非你寻找流 underflow在 get 区域被调用 sgetn 清空之前不会被再次调用/xsgetnsbumpc
我认为您可能会更成功地包装而不是扩展文件缓冲区。

Boost iostreams使编写流过滤器变得更加简单。

关于c++ - 自定义 std::fstream、std::filebuf 的上溢和下溢函数不会为每个字符调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62391083/

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