如何在c ++中反转输出流?

时间:2016-05-08 11:33:47

标签: c++

我想要实现的是使用标准的std :: cout,如果你理解,将输出反转为输入,这样我程序的另一部分就可以读取它。不,我不能只在程序的其他部分调用一个函数,因为每个函数都必须保持私有,所以这似乎是唯一的方法。通过将默认输出流重定向到我自己的自定义输出流,我在java中做了类似的事情,但我对c ++有点新鲜。这就是我在java中所做的:

System.setOut(customPrintStream);

有没有人知道c ++的替代方法或者获取打印到控制台的任何内容?

2 个答案:

答案 0 :(得分:2)

c ++标准库支持“反向迭代器”的概念。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    auto s = std::string("Hello, World");
    std::copy(std::rbegin(s), std::rend(s),
              std::ostream_iterator<char>(std::cout));
    std::cout << std::endl;
    return 0;
}

预期产出:

dlroW ,olleH

答案 1 :(得分:0)

C ++中的流读取和写入std::streambuf个对象。您可以使用std::ostream函数替换rdbuf()对象的流缓冲区。例如,要捕获std::cout中写入std::string的所有输出,您可以使用以下内容:

 std::ostreamstream stream;
 std::streambuf*    sbuf = std::cout.rdbuf(stream.rdbuf());
 // use code whose output is written to `std::cout`
 std::cout.rdbuf(sbuf); // restore the original stream buffer
 std::string output = stream.str();

在实际实现中,您可能使用RAII方法来替换/恢复流缓冲区。此外,您可能希望使用自定义流缓冲区而不是std::stringbuf,但基本保持原样。