【问题标题】:Modify contents of basic_ostream object in c++ or, deleting data contents of basic_ostream object在c++中修改basic_ostream对象的内容或删除basic_ostream对象的数据内容
【发布时间】:2015-09-16 21:08:55
【问题描述】:

我在一个函数中得到一个ostream 对象引用。它包含一个我需要修改的字符串。 我使用rdbuf() 函数将ostream 的内容复制到stringstream 中。 现在我需要将更新的字符串流(即底层字符串)复制回 ostream 对象。我该怎么做?

我搜索了擦除ostream内容的方法,但没有找到。

注意:我无法更改其他功能的实现,即我无法使用ostringstream(我知道这可以解决我的问题)。

【问题讨论】:

  • 你确定你有一个实际的std::ostream 对象实例而不是一个引用吗?我会争辩说,如果您需要在事后修改某些输出,那是糟糕的设计。此外,您怎么知道您要修改的实际字符串仍然是 in 缓冲区?如果它已经被冲洗了怎么办?
  • 很抱歉,这是一个参考,而不是副本。

标签: c++ stream ostream


【解决方案1】:

您可以尝试使用ostream::seekp()streambuf::pubseekpos() 更改流中的当前位置:

std::ofstream out;

out.seekp(-10, std::ios_base::cur); // move back 10 positions from current location
out.rdbuf()->pubseekpos(12); // move to position 12

请记住:

  • 如果数据的底层目标不支持查找,这可能会失败(例如,streambuf 可能实际上将数据写入套接字)
  • 如果它适用于您的特定类型的流,则必须记录位置和长度以及覆盖的数量(如果新值的长度与您要在流中替换的旧值不同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多