8

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

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

4

3 回答 3

7

是的,std::ios_base::out相当于"w"in 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"
于 2013-08-04T07:50:57.633 回答
5

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

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

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

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

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

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

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

于 2013-08-04T08:00:00.433 回答
1

它是多余的——换句话说,你有没有它都没有区别。

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

于 2013-08-04T07:46:24.027 回答