【问题标题】:c++ simple stream manipulation with ostream and istream?c++ 使用 ostream 和 istream 进行简单的流操作?
【发布时间】:2014-12-03 07:36:12
【问题描述】:

我一直在寻找解决方案,但找不到我需要/想要的。

我想要做的就是将一个用于 std::cout 的流传递给一个函数,该函数对其进行操作。到目前为止我使用的是一个模板函数:

template<typename T>
void printUpdate(T a){
   std::cout << "blabla" << a << std::flush;
}

int main( int argc, char** argv ){

  std::stringstream str;
  str << " hello " << 1 + 4 << " goodbye";
  printUpdate<>( str.str() );

  return 0;
}

我更喜欢这样的:

printUpdate << " hello " << 1 + 4 << " goodbye";

 std::cout << printUpdate << " hello " << 1 + 4 << " goodbye";

我想这样做:

void printUpdate(std::istream& a){
   std::cout << "blabla" << a << std::flush;
}

但这给了我:

error: invalid operands of types ‘void(std::istream&) {aka void(std::basic_istream<char>&)}’ and ‘const char [5]’ to binary ‘operator<<’

【问题讨论】:

  • 您不能将数据输出到输入流。将参数更改为std::ostream&amp; a。此外,flush 没有为输入流定义。
  • 我也试过了。相同的错误:错误:'void(std::ostream&) {aka void(std::basic_ostream&)}'和'const char [5]'类型的无效操作数到二进制'operator
  • 在您的main函数中,您需要为printUpdate函数调用提供流类型,例如printUpdate&lt;std::ostream&gt;
  • 不知道你到底想要什么。但是如果你想做任何看起来像printUpdate() &lt;&lt; "this is my output" 的事情(注意括号),你必须从printUpdate() 返回流。如果您想在将其推送到std::cout 之前对右侧做一些花哨的事情,或者您想在您的内容之后将某些内容推送到 std::cout(如 printUpdate 的内容所建议的那样), printUpdate 应该是一个类一个重载的template &lt;typename T&gt; operator&lt;&lt;(T data)。然后你可以将printUpdate &lt;&lt; "Bla"翻译成std::cout &lt;&lt; X &lt;&lt; "Bla" &lt;&lt; Y,其中XY是固定的。
  • @Oguk 谢谢,所以可能没有比让 printUpdate 成为一个类更简单的替代方法了。

标签: c++ stream iostream cout


【解决方案1】:

您不能将数据输出到输入流,这不是一件好事。 变化:

void printUpdate(std::istream& a){
   std::cout << "blabla" << a << std::flush;
}  

收件人:

void printUpdate(std::ostream& a){
   std::cout << "blabla" << a << std::flush;
}

注意流类型的变化。

编辑 1:
此外,您不能将一个流输出到另一个流,至少是std::cout
&lt;&lt; a的返回值为ostream类型。
cout 流不喜欢被提供另一个流。

改为:

void printUpdate(std::ostream& a)
{
  static const std::string text = "blabla";
  std::cout << text << std::flush;
  a << text << std::flush;
}  

编辑 2:
您需要将流传递给需要流的函数。
不能将字符串传递给需要流的函数。
试试这个:

  void printUpdate(std::ostream& out, const std::string& text)
  {
    std::cout << text << std::flush;
    out << text << std::flush;
  }

  int main(void)
  {
    std::ofstream my_file("test.txt");
    printUpdate(my_file, "Apples fall from trees.\n");
    return 0;
  }

链接输出流 如果您想将事物链接到输出流,例如函数的结果,则函数必须返回可打印(可流式传输的对象)或相同的输出流。

例子:

  std::ostream& Fred(std::ostream& out, const std::string text)
  {
    out << "--Fred-- " << text;
    return out;
  }

  int main(void)
  {
    std::cout << "Hello " << Fred("World!\n");
    return 0;
  }

【讨论】:

  • 我也试过了。相同的错误:错误:'void(std::ostream&) {aka void(std::basic_ostream&)}'和'const char [5]'类型的无效操作数到二进制'operator
  • 错误消息与我编辑中的示例不匹配,因为 textstd::string 不是 5 个字符的数组。
  • 对不起,错误信息来自函数调用:printUpdate
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2021-01-12
  • 2020-02-10
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多