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
,即trunc
flag 可以省略。
但是,对于双向文件流,trunc
必须始终明确指定。
要扩展输出文件,std::ios_base::ate | std::ios_base::app
使用标志。
此处,由于未设置标志,因此保留了文件内容trunc
,并且初始文件位置在文件的末尾。
但是, trunc
可以另外设置标志,并且文件内容被丢弃并且在空文件的末尾完成输出。
它是多余的——换句话说,你有没有它都没有区别。
显然,在某些组合中,例如std::ios_base::out | std::ios_base::in
它不会是多余的。