关于文件操作代码移植的有关问题

关于文件操作代码移植的问题
仔细想了一下关于文件操作的代码

1.在VS中,打开文件的模式参数有(省略了ios_base::):
app:追加,文件不存在则创建
ate:这个不是很明白,好象是或第一次创建一个文件时把文件指针定位到文件尾binary:以2进制形式打开。
in,out:不用说了,但是他们并不创建文件。out也不清除文件内容。
tunc:打开已存在文件时间清除文件内容。

2.C++   Primer中说,app,out打开文件时都会创建文件,out会丢弃文件内容,不过是在UNIX中。

3.折中一下:
可以用以下代码打开文件,如果文件不存在,则创建文件:
fstream   file;
if   (   !file.open   ( "abc.txt "   ,   ios_base::out|ios_base::in)
            file.open   ( "abc.txt "   ,   ios_base::app)   ;
……………………//处理代码

问题1:要是在out可以创建文件并清除内容的系统中,那那个条件判断不是很浪费?
问题2:那个ate是干吗用的?
问题3:往文件中插入内容,除了清除文件重新写以外,还有别的办法么?
问题4:fstream::open()第3个参数的介绍,MSDN里没找到,也许是我找的还不够仔细,提示一下吧```谢谢,呵呵

其实主要就在于,只有app会新建文件,而app又非要在你每次写入内容时定位到文件末尾。

俺向来以结帖迅速闻名世界,希望清楚这些东西的前辈们不吝赐教,给点提示也好,谢谢啦先。

------解决方案--------------------
1.in|out 打开文件做读,写操作,并定位于文件开头
2.ate 定位在文件尾
trunc 如果文件存在,把文件尾长度设为0(清空已存在的文件流)
3.还可以在围歼尾添加 out|trunc
4.如果open函数只有文件名---一个参数,则以读/写普通文件打开
例:file1.open( "c:\\config.sys "); <======> file1.open( "c:\\config.sys ",in|out,0);
------解决方案--------------------
1.那个条件不浪费,总是要判断是不是建立成了这个流,建立不成也是有可能的。对与in ,要是没有文件,判断就是非。
2.ate表示at end 到文件末尾。
3.使用seekp(pos)等,写入绝对位置,seekp(offset,pos),写入相对位置
对于读用seekg(pos),seekg(offset,pos);
4.也不太清楚,好像不是STL标准的,可能是微软自家的。看有高手相告
------解决方案--------------------
问题1:要是在out可以创建文件并清除内容的系统中,那那个条件判断不是很浪费?

如果根本就没有访问权限,那就是失败。比如windows下,你向一个光驱的路径(或者不存在的驱动器)写文件,结果就是失败。


------解决方案--------------------
The I/O stream mode flags allow you to access files in different ways. The flags are:
Mode Meaning
ios::app append output
ios::ate seek to EOF when opened
ios::binary open the file in binary mode
ios::in open the file for reading
ios::out open the file for writing
ios::trunc overwrite the existing file
------解决方案--------------------
除了写日志,很少用添加模式。
如果是为了移植,建议在此之上包装一层,以在各个平台上都有统一的语义。