不复制地将std :: ostringstream写入文件?

3

给定一个以输出stringstream为参数的函数:

void Foo(const std::ostringstream& _oss);

有没有一种方法可以将流缓冲区写入文件,而无需调用str()?
我想避免复制缓冲区(str()会这样做)。
void Foo(const std::ostringstream& _oss);
{
  std::ofstream f("foo.bin");

  //WANT: write _oss to f without copying the buffer?
}
2个回答

12

有一个带有流缓冲区的operator<<()操作符:

f << _oss.rdbuf();

然而,缓冲区需要非常大才能显著提高性能。通常,写入磁盘的时间会占用更多时间。

请注意,我会避免创建带有前导下划线的标识符。


那会逐字节地写入缓冲区,对吗?不知道这样做是否比通过str()获取缓冲区并一次性写入更慢。 - vdsf
如果它确实是一个 ostringstream,那么相关的 stringbuf 是否可以在仅输出模式下构造? - Nemo
确实有效。然而,我有一个额外的限制条件会带来问题——在写入文件之前,我需要知道缓冲区大小,因为根据大小我需要进行特殊处理。我想 str() 是我的唯一选择。 - vdsf

0

如果你想将内容写入文件,就必须进行复制操作——因为写入文件的操作就是将内容从内存中复制到磁盘上。

当然,如果你想更深入地了解这个问题,你也可以使用内存映射文件。


4
Turbovince试图避免通过调用str()成员函数来进行复制。 - sbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接