【问题标题】:how to reset stream open flags?如何重置流打开标志?
【发布时间】:2011-10-31 23:59:03
【问题描述】:

所以我正在做的是在二进制模式下创建一个字符串流。在某个地方,我不想再将其视为二进制,而是将其视为常规字符串流。

查看文档,只有在构建流时才关心它们是二进制、输入还是输出(ios_base::openmode 标志)。您可以更改操纵器标志和错误标志,但显然不能更改 openmode 标志?可能是我看的不够仔细?

所以我目前正在做的事情是这样的

std::stringstream memory( ios_base::in | ios_base::out | ios_base::binary );
boost::iostreams::copy( *source_file, memory );

在某个地方,我希望能够做类似的事情

memory.reset_openmode( ios_base::in | ios_base::out );

【问题讨论】:

  • 您真的需要换行翻译吗?尤其是在内存流中?
  • all 二进制标志吗?所以你是说,如果我以二进制模式打开某些东西,稍后当我想将其视为文本时,我可以做所有我想要的 memory >> somestring,而只有新行字符没有被正确读取

标签: c++ stream


【解决方案1】:

您可以做的(也是我会做的)是我将关闭流,然后将流作为基本文本文件重新打开,并根据需要设置 seekg() 和 seekp() 标志。

【讨论】:

  • 它是一个字符串流,而不是一个 fstream,所以没有关闭它。我正在使用 boosts 副本从处理 zip 存档的自定义 file_source 类中获取数据。当我知道我希望流是二进制还是字符时,我可以延迟复制,但也许以后我就没有那么奢侈了,我只想知道如何处理它。
  • 字符串流和 fsteream 有什么区别,我从来没有关注过它。我知道他们都可以使用原始二进制文件,而且我知道 fstream 可以更改为字符串输入流,然后在需要时再返回。
  • 好吧,首先,如果我关闭一个 fstream,它会将其中的所有内容写入磁盘。我不希望任何东西被写入磁盘。因为这意味着我的应用程序正在将压缩文件提取到磁盘,然后使用提取的文件来读取它们!不是一个很好的做事方式。
猜你喜欢
  • 2010-12-03
  • 2020-03-27
  • 1970-01-01
  • 2011-11-07
  • 2012-10-19
  • 1970-01-01
  • 2018-05-11
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多