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

Fro*_*art 5 c++

使用std::ios_base::trunc标志的目的是什么std::ios_base::out?我在很多例子中都看过这个.

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

tim*_*qiu 9

是的,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"
Run Code Online (Sandbox Code Playgroud)


P0W*_*P0W 5

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

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

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

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

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

这里,文件内容被保留,因为trunc没有设置标志,初始文件位置在文件的末尾。

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