std::ios_base::trunc
使用std::ios_base::out
标记的目的是什么?我在很多例子中看到了这一点。
我认为标准保证std::ios_base::out
也会截断文件(以及我所知道的所有STL实现)。我错了,应该明确通知我要截断文件吗?
答案 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::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"
答案 2 :(得分:1)
这是多余的 - 换句话说,如果你有或没有它没有区别。
显然,在某些组合中,例如std::ios_base::out | std::ios_base::in
,它不会是多余的。