【问题标题】:How to compose stream operations in C++?如何在 C++ 中编写流操作?
【发布时间】:2017-02-20 04:57:51
【问题描述】:

对于某个程序,我有两个函数接受输入和输出流,对输入进行一些操作并写入输出。我可以这样称呼他们:

a(cin, cout);
b(cin, cout);

假设我想按顺序运行它们,以便应用来自 a 和 b 的操作。目前,我使用 stringstream 作为中间 iostream 来存储结果,如下所示:

stringstream buffer;
a(cin, buffer);
b(buffer, cout);

然而,这几乎否定了流的使用,因为所有数据都保留在内存中以用于中间步骤,即使这两种操作都可以应用于具有恒定内存的流。

是否有一种(标准)技术可以用来组合这些操作,最好不要过多地更改ab?另外,如果可能的话,我想避免提升。

注意:此处的函数仅用于示例目的。在实际程序中,两者都是两个对象上的方法。

【问题讨论】:

  • 你是说你想做一些类似于 std::endl 的事情(实际上是一个函数)?
  • 但是,这几乎否定了流的使用,因为所有数据都保留在内存中以用于中间步骤,即使这两种操作都可以应用于具有恒定内存的流。从您的帖子中不清楚为什么这是一个问题。从性能的角度来看,我认为将数据保存在内存中会是一个加分项。
  • @UKMonkey 我不确定它是如何工作的,但如果它可以帮助我创建与我的第二个代码示例等效的功能,是的。
  • @RSahu:如果我可以编写动作,我可以直接发送我的数据,所以如果我的输入是 1TB 大小,我实际上不需要 1TB 的内存来存储中间结果。所以这实际上是一个问题。
  • 一个主要问题是您的第一个操作被设计为在调用第二个操作之前运行完成。即使您使用 fifo 或其他东西将流连接在一起,您仍然不会并行执行这两个操作,除非您还使用另一个线程或重组您的操作以处理较小的数据块。

标签: c++ stream c++14


【解决方案1】:

是否有一种(标准)技术可以用来组合这些操作,最好不要过多地改变 a 和 b?另外,如果可能的话,我想避免提升。

您真正想要的是某种生产者/消费者习惯用法,其中生产者从 IN 读取数据,而消费者向 OUT 写入数据。据我所知,原生 C++ 中没有任何帮助,尽管 Boost 支持协程(据我所知)这基本上是你最终会得到的。

这是一种实现程序的方法,可以让您对ab 进行最小的更改。在这种情况下,我假设您正在阅读一个以行分隔的文本文件。如果您正在读取二进制文件,则需要读取固定数量的字节,而不是一行。)

std::stringstream buffer;
std::string line;
while (std::getline(std::cin, line))
{
  std::istringstream iss(line);
  a(iss, buffer);
  b(buffer, std::cout);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多