打印到控制台或字符串/流

时间:2017-03-24 13:45:56

标签: c++ c++11

我需要一个C ++函数将一些文本数据(多行)转储到控制台:

void DumpData() const
{
    std::cout << "My Data 1" << std::endl;
    std::cout << "My Data 2" << std::endl;
}

这应该是默认行为,但是,还必须能够传递一些其他流对象而不是std::cout,如下所示:

void DumpData(std::ostream& Stream = std::cout) const
{
    Stream << "My Data 1" << std::endl;
    Stream << "My Data 2" << std::endl;
}

现在回答我的问题:

  1. 我应该为参数使用的正确类型是什么(本例中为std::ostream&)?
  2. 默认值是什么,我可以直接使用= std::cout吗?
  3. 此外(3.),在调用此函数后,如果我传递自己的流对象,我需要逐行遍历此流中的所有字符串。实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

1和2是正确的。您的另一个选择是使用std::ostringstream,但由于std::coutstd::ostream,您需要使用此签名定义另一个函数。

要迭代自定义输出,我会convert the stream to a string,然后使用某种字符串拆分来读取每一行。

答案 1 :(得分:1)

你为什么不亲自尝试一下?

以下是std::coutstd::stringstream的代码in Coliru作为示例(const明显删除了DumpData

#include <iostream>
#include <sstream>

void DumpData(std::ostream& Stream = std::cout)
{
    Stream << "My Data 1" << std::endl;
    Stream << "My Data 2" << std::endl;
}
int main() {
    DumpData();
    std::stringstream ss;
    DumpData(ss);
    std::string l;
    while(std::getline(ss, l)) {
        std::cout << l << std::endl;
    }
    return 0;
}

输出符合您的预期。

答案 2 :(得分:0)

添加到@Jay的答案,您可以使用模板参数,以便能够使用各种流,例如std::stringstreamstd::iostream,只要模板参数支持{{ 1}} operator。

<<

通过确保提供的类型T超载运算符template <typename T> // = decltype(something) void DumpData(T& Stream = std::cout) const { Stream << "My Data 1" << std::endl; Stream << "My Data 2" << std::endl; } ,您可以更进一步。

同样在某些情况下,某些(可能是自定义的)流可能无法支持<<,因此默认使用std::endl可能更安全,因为它可以避免不必要的刷新,因此总是更好。{ / p>