【问题标题】:Writing std::ostringstream to file without copying?将 std::ostringstream 写入文件而不复制?
【发布时间】:2011-06-13 21:09:26
【问题描述】:

给定一个将输出字符串流作为参数的函数:

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?
}

【问题讨论】:

    标签: c++ io


    【解决方案1】:

    有一个operator<<() 占用了一个流缓冲区:

    f << _oss.rdbuf();
    

    但是,缓冲区需要非常大才能产生明显的差异。通常,无论如何,写入磁盘将占主导地位。

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

    【讨论】:

    • 那会逐字节写入缓冲区,对吗?想知道这是否会比通过 str() 获取缓冲区并一次写入要慢..
    • 如果真的是ostringstream,难道关联的stringbuf不是在只输出模式下构造的吗?
    • 确实有效。不过,我还有一个额外的约束条件——我需要在写入文件之前知道缓冲区大小,因为我需要根据大小进行特殊处理。我猜 str() 是我唯一的手段..
    【解决方案2】:

    如果不进行复制,就无法将其写入文件——因为写入文件就是这样做的,它会将文件从内存中复制到磁盘上。

    当然,如果你想了解这方面的技术,可以利用内存映射文件。

    【讨论】:

    • turbovince 试图通过调用 str() 成员函数来避免复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多