【问题标题】:std::ios_base::ate and std::ios_base::truncstd::ios_base::ate 和 std::ios_base::trunc
【发布时间】:2012-08-28 12:07:21
【问题描述】:

std::ios_base::ate(例如std::ios_base::app 除外)和std::ios_base::trunc(例如std::ios_base::out 除外)有什么意义?

我应该更喜欢写std::ios_base::smth而不是std::ios::smth吗?

【问题讨论】:

  • std::ios_base::instd::ios::in 应该相同,这取决于你。
  • @veer 是的,他们是,还有 any::ios_base::descendant::in :)

标签: c++


【解决方案1】:

std::ios_base::ate 将光标定位在文本的末尾,而 std::ios_base_app 在末尾附加文本(带有写操作),尽管您仍然可以从头开始阅读:)

std::ios_base::trunc 截断文件,使其被清空,而 std::ios_base::out 只是指定您要写入流。

我目前无法引用该标准(在我的平板电脑上,Acrobat Reader 不允许复制),但从 ISO 14882:1998 的第 27.4.2.1.4 段中,您可以在链接上看到的信息几乎是准确的: http://cplusplus.com/reference/iostream/ios_base/openmode/

总结一下:

std::ios_base::app = append

通过“seek[ing] to end before each write”追加到流的末尾

std::ios_base::ate = At The End

打开后立即在末尾查找

std::ios_base::binary = binary

以二进制而不是文本执行操作

std::ios_base::in = input

以阅读模式打开

std::ios_base::out = output

以写入模式打开

std::ios_base::trunc = truncate

在打开时截断流。

这些值只是标志,因此您可以在末尾使用读/写二进制文件打开流:

std::ios_base::in | std::ios_base::out | std::ios_base::ate | std::ios_base::binary

关于使用这些值的方式,如你所愿。它们在 std::ios_base 类中被声明为公共静态字段(参见 27.4.2),因此可以使用 std::ios::ate 甚至类似 cout.binary 的东西来访问它们!


您必须注意的一点是std::ios_base::ate 并不暗示std::ios_base::appstd::ios_base::out 也不暗示std::ios_base::trunc。每个字段都有不同的含义,也有不同的使用情况,虽然大部分都不能单独使用:)

【讨论】:

  • 但是std::ios_base::out也会清除文件中的数据,不是吗?你能给我一个 std::ios_base::out 不清除文件的例子吗?
  • 从这里:cplusplus.com/reference/iostream/ios_base/openmode 你得到每个值的定义。此外,这个答案@veer 对 std::ios_base::in 和 std::ios::in 的评论
  • “你仍然可以从头开始阅读”是什么意思?请给我一个例子好吗?
  • 我的意思是 ios::ate 将光标定位在流的末尾,因此您仍然可以根据需要移动它(如果流不为空并允许它)跨度>
  • 为什么我不能用 std::ios_base::app 做到这一点?我也可以使用 seekp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多