透明地操纵插入ostream的字符串

时间:2010-10-07 14:29:01

标签: c++ iostream

我想从用户的角度提供std::ostream可能会或可能不会加密其内容。

想象一下使用std::ostream&的一些随机函数:

void write_stuff( std::ostream& stream ) {
    os << "stuff";
}

stuff是以明文形式输出还是加密取决于stream参数的初始化方式。

我正在考虑从std::basic_streambuf继承,但我不确定这是最好的方法。我认为理想的场景是在实际输出内容之前运行的某种过滤器对象。这样就可以很容易地进行连锁操作,例如加密然后进行十六进制编码,这使我自己的basic_streambuf似乎没有给出(至少不容易)。

有任何建议吗?

感谢。

更新:我遵循了接受的答案所规定的策略。我发现这篇关于写custom streambuf which performs XOR obfuscation的文章作为一个起点非常有用。

3 个答案:

答案 0 :(得分:4)

streambuf可以用另一个任意streambuf来实现,它可以作为参数传递给构造函数,也可以使用特殊的成员函数进行设置。这样就可以像你想象的那样堆叠streambuf个实现。

您甚至可以制作一个使用ostream的{​​{1}}函数来获取当前rdbuf的操纵者,在streambuf上调用设置'堆叠'的函数“streambuf,然后再次致电streambuf,将rdbuf的{​​{1}}替换为您自己的ostream

streambuf

答案 1 :(得分:2)

很难简单地描述为新源或接收器创建I/O stream所需要做的事情。幸运的是,Jonathan TurkanisCodeRage, LLC创建了非常好的构建块,具有出色的文档,可以帮助您节省数百小时的新流的研究和开发。该库名为Boost.Iostreams

文档中的second example确切地说明了如何解决您的问题。

另外,请注意他们已经有一个带zip压缩的输出流。所以也许你甚至不需要编写一行代码。

祝你好运!

答案 2 :(得分:0)

我不确定我要提出的建议正是你所需要的(而且它太复杂而无法发表评论),但你有没有听说过操纵者?< / p>

#include <iostream>
#include <iomanip>

int main(int, char**)
{
  int a = 10;
  std::cout << "a: " << a << std::endl; //outputs: "a: 10"
  std::cout << "a: " << std::hex << a << std::endl; //outputs: "a: a"
  std::cout << "a: " << std::dec << a << std::endl; //outputs: "a: 10"

  return EXIT_SUCCESS;
}

您可能确实使用了类似的模式(这与您实际称为“过滤器”对象的模式匹配)以某种方式更改自定义流对象的状态。