问一下:ios::app与ios::ate打开方式有什么不同??

snow810211 2005-01-03 09:01:50
看一个资料上说:
1.ios::app ----写入的数据将被追加在文件的末尾,此方式使用ios::out
2.ios::ate ----写入的数据将被追加在文件的末尾,此方式不使用ios::out

但是我看不懂最后一句,什么叫使用和不使用“ios::out”呢??

ios::out本身不是就是打开一个可写文件吗?
既然都能追加写入了,还能不让写?

谢谢。
...全文
7350 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanjie 2005-01-06
  • 打赏
  • 举报
回复
更正我上面的言论:
ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么在文件尾追加。
以ios::app|ios::in打开,不管有没有文件,都是失败。
以ios::ate打开(或者”ios::ate|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么清空该文件
以ios::ate|ios::in打开,如果没有文件,那么打开失败;如果有文件,那么定位到文件尾,并可以写文件,但是不能读文件

ifstream流,以ios::app打开(“ios::app|ios::out”),不管有没有文件,打开都是失败。
以ios::ate打开(“ios::ate|ios::out”),如果没有文件,打开失败
如果有文件,打开成功,并定位到文件尾,但是不能写文件


fstream流,默认是ios::in,所以如果没有文件,ios::app和ios::ate都是失败,
以ios::app|ios::out,如果没有文件则创建文件,如果有文件,则在文件尾追加
以ios::ate|ios::out打开,如果没有文件则创建文件,如果有,则清空文件。
以ios::ate|ios::out|ios::in打开,如果没有文件,则打开失败,有文件则定位到文件尾

可见:ios::app不能用来打开输入流,即不能和ios::in相配合
而ios::ate可以和ios::in配合,此时定位到文件尾;如果没有ios::in相配合而只是同ios::out配合,那么将清空原文件

可以在《C++ 输入输出流及本地化》1.4.2中找到更详细的描述:(大意)以ios::app方式打开文件,即使修改文件指针,也只能输出到文件尾。实际上以ios::app打开的文件的写入,和文件指针五关。

奇怪的是:《C++ 输入输出流及本地化》和《C++编程思想》都说以ios::ate打开的文件,文件指针都会定位到文件尾且不清空文件,但是我发现ios::ate如果不和ios::in配合的话,将清空原文件。
tanjie 2005-01-05
  • 打赏
  • 举报
回复
ios::app默认以写的方式打开文件
而ios::ate默认以读的方式打开文件
如果要打开的文件不存在,那么ios::app将生成这个文件(空),而ios::ate将打开失败
其实可以这样想:app是append(添加)的意思,这个词本身就带有写的意思,而ate是at end的意思,只是单纯的“找到文件尾的意思”没有指明是读还是写,所以就默认为以读方式打开文件。
当然,二者都可以跟ios::in和ios::out相配合,当和ios::in配合时,两者行为一致,都是以读方式打开;当和ios::out配合时,行为也是一致的,都是以写方式打开文件

ps:upcc最近还好吗?
Squall1009 2005-01-04
  • 打赏
  • 举报
回复
1.ios::app ----写入的数据将被追加在文件的末尾,此方式使用ios::out
2.ios::ate ----写入的数据将被追加在文件的末尾,此方式不使用ios::out

ios::app 多个线程或者进程对一个文件写的时候,假如文件原来的内容是abc,第一个线程(进程)往里面写了个d,第二个线程(进程)写了个e的话,结果是abcde

ios:ate的话,后面写的回覆盖前面一个写的,还是上面那个例子的话(第二个后写)结果为abce
Dong 2005-01-03
  • 打赏
  • 举报
回复
差别在于当文件不存在时是否创建文件??
melonliu 2005-01-03
  • 打赏
  • 举报
回复
我就偷个懒直接贴 msnd了

Flag Function
ios::app Opens an output file for appending.
ios::ate Opens an existing file (either input or output) and seeks the end.
ios::in Opens an input file. Use ios::in as an open_mode for an ofstream file to prevent truncating an existing file.
ios::out Opens an output file. When you use ios::out for an ofstream object without ios::app, ios::ate, or ios::in, ios::trunc is implied.
ios::nocreate Opens a file only if it already exists; otherwise the operation fails.
ios::noreplace Opens a file only if it does not exist; otherwise the operation fails.
ios::trunc Opens a file and deletes the old file (if it already exists).
ios::binary Opens a file in binary mode (default is text mode).
melonliu 2005-01-03
  • 打赏
  • 举报
回复
你看的是什么资料哦??

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧