ofstream之ios::ate,ios::app,ios::in,ios::out

本文详细解析了C++中ofstream、ifstream及fstream流的各种打开模式,包括ios::app、ios::ate等,并阐述了这些模式下文件的操作行为,如文件追加、清空及定位等。

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配合,那么将清空原文件
(ios::ate|ios::in–>在原文件尾追加内容;ios::ate—>清空原文件,ios::out是默认必带的,可加上也可不加,对程序无影响)
可以在《C++ 输入输出流及本地化》1.4.2中找到更详细的描述:(大意)以ios::app方式打开文件,即使修改文件指针,也只能输出到文件尾。实际上以ios::app打开的文件的写入,和文件指针五关。
(这里就指出了ate和app的关键区别,app只能在尾部追加,ate可以配合指针修改文件中的部分内容。)
奇怪的是:《C++ 输入输出流及本地化》和《C++编程思想》都说以ios::ate打开的文件,文件指针都会定位到文件尾且不清空文件,但是我发现ios::ate如果不和ios::in配合的话,将清空原文件

### `ios::ate|ios::out` 模式 当使用 `ios::ate|ios::out` 模式打开文件时,如果文件不存在,系统会创建一个新的空文件。这是因为 `ios::out` 模式允许以输出模式打开文件,若文件不存在就会创建文件。而 `ios::ate` 标志的作用是在打开文件后将文件指针定位到文件末尾,但由于文件是新创建的,此时文件为空,文件末尾也就是文件开头。 如果文件已经存在,该模式会先清空文件内容,然后将文件指针定位到文件末尾。这意味着原文件中的所有数据都会被删除,后续的写入操作会从文件开头(此时也是文件末尾)开始。以下是示例代码: ```cpp #include <iostream> #include <fstream> int main() { std::ofstream outFile("test.txt", std::ios::ate | std::ios::out); if (outFile.is_open()) { outFile << "New content after opening with ios::ate|ios::out"; outFile.close(); } return 0; } ``` ### `ios::ate|ios::in` 模式 使用 `ios::ate|ios::in` 模式打开文件时,如果文件不存在,会尝试创建文件。`ios::in` 模式表示以输入模式打开文件,若文件不存在,在某些实现中可能会失败,但在支持创建文件的环境下会创建一个新文件。创建后,文件指针会被定位到文件末尾。 如果文件已经存在,会直接打开该文件,并将文件指针定位到文件末尾。这样后续的读取操作会从文件末尾开始,通常用于查看文件末尾的内容或者在文件末尾添加读取标记等操作。示例代码如下: ```cpp #include <iostream> #include <fstream> int main() { std::ifstream inFile("test.txt", std::ios::ate | std::ios::in); if (inFile.is_open()) { std::streampos fileSize = inFile.tellg(); std::cout << "File size: " << fileSize << " bytes" << std::endl; inFile.close(); } return 0; } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值