std::ios_base::trunc使用flag的目的是什么std::ios_base::out?我在很多例子中都看到了这一点。
我认为它是由标准来保证的,该标准std::ios_base::out也会截断文件(以及我知道的所有 STL 实现都这样做)。我错了,应该明确通知我要截断文件吗?
std::ios_base::trunc使用flag的目的是什么std::ios_base::out?我在很多例子中都看到了这一点。
我认为它是由标准来保证的,该标准std::ios_base::out也会截断文件(以及我知道的所有 STL 实现都这样做)。我错了,应该明确通知我要截断文件吗?
是的,std::ios_base::out相当于"w"in fopen。
关键std::ios_base::trunc是何时std::ios_base::in和std::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"
要替换文件的内容而不是扩展文件,必须在
std::ios_base::out | std::ios_base::trunc
对于输出文件流,打开模式 out 等价于out|trunc,即truncflag 可以省略。
但是,对于双向文件流,trunc必须始终明确指定。
要扩展输出文件,std::ios_base::ate | std::ios_base::app使用标志。
此处,由于未设置标志,因此保留了文件内容trunc,并且初始文件位置在文件的末尾。
但是, trunc可以另外设置标志,并且文件内容被丢弃并且在空文件的末尾完成输出。
它是多余的——换句话说,你有没有它都没有区别。
显然,在某些组合中,例如std::ios_base::out | std::ios_base::in它不会是多余的。