将std :: ios_base :: trunc标志与std :: ios_base :: out一起使用的目的是什么

时间:2013-08-04 07:37:38

标签: c++

std::ios_base::trunc使用std::ios_base::out标记的目的是什么?我在很多例子中看到了这一点。

我认为标准保证std::ios_base::out也会截断文件(以及我所知道的所有STL实现)。我错了,应该明确通知我要截断文件吗?

3 个答案:

答案 0 :(得分:4)

要替换文件的内容而不是扩展文件,必须在

中打开

std::ios_base::out | std::ios_base::trunc

对于输出文件流,打开模式输出等同于out|trunc,即trunc标志可以省略。

但是,对于双向文件流,必须始终明确指定trunc

要扩展输出文件,请使用标记std::ios_base::ate | std::ios_base::app

此处,保留文件内容,因为未设置trunc标志,并且初始文件位置位于文件末尾。

但是,可以设置另外的trunc标志,并丢弃文件内容,并在空文件的末尾完成输出。

答案 1 :(得分:3)

是的,std::ios_base::out相当于"w"中的fopen

std::ios_base::trunc的重点是同时使用std::ios_base::instd::ios_base::out

  • in | out相当于"r+"
  • in | out | trunc相当于"w+"
  • binary | in | out相当于"rb+"
  • binary | in | out | trunc相当于"wb+"

也许桌子会更明显:

binary  in  out  trunc | stdio equivalent
-----------------------+-----------------
         +   +         |      "r+"
         +   +     +   |      "w+"
  +      +   +         |      "r+b"
  +      +   +     +   |      "w+b"

答案 2 :(得分:1)

这是多余的 - 换句话说,如果你有或没有它没有区别。

显然,在某些组合中,例如std::ios_base::out | std::ios_base::in,它不会是多余的。