用ostream和istream进行c ++简单的流操作?

时间:2014-10-08 15:09:39

标签: c++ stream iostream cout

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

我想要做的就是将一个用于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<<’

1 个答案:

答案 0 :(得分: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 << 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;
  }