从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一、文件流
ofstream,由ostream派生而来,用于写文件
ifstream,由istream派生而来, 用于读文件
fstream,由iostream派生而来,用于读写文件
二、打开文件
说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接
函数原型
void open(const char * filename, int mode = ios::out,int prot = _SH_DENYNO);
参数
filename:文件的名称,可以包含(绝对和相对)路径
mode:文件打开模式
prot:保护模式
(一)、文件打开模式
打开方式描述
ios::in打开一个供读取的文件(ifstream流的默认值)
ios::out打开一个供写入的文件(ofstream流的默认值)
ios::app在写之前找到文件尾
ios::ate打开文件后立即将文件定位在文件尾
ios::trunc废弃当前文件内容
ios::nocreate(已不再支持)如果要打开的文件并不存在,那么以此参数调用open()函数将无法进行
ios::noreplace (已不再支持)如果要打开的文件已存在,试图用open()函数打开时将返回一个错误。
ios::binary以二进制的形式打开一个文件,默认为文本文件
(二)、保护模式
#define _SH_DENYRW 0x10 /* deny read/write mode */拒绝对文件进行读写
#define _SH_DENYWR 0x20 /* deny write mode */拒绝写入文件
#define _SH_DENYRD 0x30 /* deny read mode */拒绝文件的读取权限
#define _SH_DENYNO 0x40 /* deny none mode */读取和写入许可
#define _SH_SECURE 0x80 /* secure mode */共享读取,独占写入
注意:假设A进程以_SH_DENYRW 打开,那么是B进程不能再对文件进行读写。
(三)、文件打开模式的有效组合
上述所有的打开模式组合还可以添加ate模式。对这些模式添加ate模只会改变文件打开时的初始定位,在第一次读或
写之前,将文件定位于文件末尾处。
(四)、文件打开的几点说明
1、文件打开也可以通过构造函数打开,例如:
ofstream fout(“out.txt“,ios::out);
2、文件的打开方式可以为上述的一个枚举常量,也可以为多个枚举常量构成的按位或表达式。
3、使用open成员函数打开一个文件时,若由字符指针参数所指定的文件不存在,则建立该文件。(out)
4、当打开方式中不含有ios::ate或ios::app选项时,则文件指针被自动移到文件的开始位置,即字节地址为0的位置。
5、从效果上看ofstream指定out模式等同于指定了out和trunc模式
6、默认情况下,fstream对象以in和out模式同时打开。
7、当文件同时以in和out打开时不会清空
8、如果只使用out模式,而不指定in模式,则文件会清空现有数据。
9、如果同时指定了out与app,不会清空
10、如果打开文件时指定了trunc模式,则无论是否同时指定了in模式,文件同样会被清空
三、流状态
对应于这个标志字各状态位,ios类还提供了以下成员函数来检测或设置流的状态:
bool rdstate(); //返回流的当前状态标志字
bool eof(); //返回非0值表示到达文件尾
bool fail(); //返回非0值表示操作失败
bool bad(); //返回非0值表示出现错误
bool good(); //返回非0值表示流操作正常
bool clear(int flag=0); //将流的状态设置为flag
为提高程序的可靠性,应在程序中检测I/O流的操作是否正常。当检测到流操作出现错误时,可以通过异常处理来解决问题。
四、文件的关闭
每个文件流类中都提供有一个关闭文件的成员函数close()
功能:当打开的文件操作结束后,就需要关闭它,使文件流与对应的物理文件断开联系,并能够保证最后输出到文件缓冲区中的内容,无论是否已满,都将立即写入到对应的物理文件中
函数原型:void close();
文件流对应的文件被关闭后,还可以利用该文件流调用open成员函数打开其他的文件,最好先clear 一下。
|
1 |
#include <cassert>
#include <iostream> #include <fstream> using int main( //判断流状态 //if (fout.good()) //if (fout) //if (!fout) assert(fout); /************************************************************/ // assert(fin); //文件不存在,断言失败 fin.close(); //ofstream fout1("test3.txt", ios::in | ios::out | ios::app); // app 和 ate 可以共存,以app为准 assert(fout1); fout1 << fout1.close(); // app 与 trunc 不能共存,流状态为fail fout3.clear(); fout3.close(); return |
参考:
C++ primer 第四版
Effective C++ 3rd
C++编程规范
从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态的更多相关文章
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- 从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
一.文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 ...
- 从零开始学 Web 之 JS 高级(二)原型链,原型的继承
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...
- 从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化 以ios类成员函数方式格式化)
一.以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符.把它们作为插入操作符<<的输出对象即可.如setiosflags.setw.set ...
- 从零开始学 Web 系列教程
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...
- 10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource
前言 本文将上一节做的代码,对copy方法与关闭流方法进行封装,并使用try...with...resource关闭流. copy方法封装 我们将copy方法封装,使得只需传入两个流,就能将输入流的源 ...
随机推荐
- Cocos2d-x 3.0 编译出错 解决 error: expected ';' at end of member declaration
近期把项目移植到cocos2d-x 3.0,在整Android编译环境的时候,出现一大堆的编译出错,都是类似"error: expected ';' at end of member dec ...
- Front End Books
Front End Books 记录和推荐一些认为还不错的前端方面的书籍.列入标准: 看过,并觉得值得推荐给大家的. 正在看的,已经觉得不错的,或者听闻别人说不错的. 打算看的,经多人推荐,一致认为必 ...
- SQL点滴15—在SQL Server 2008中调用C#程序
原文:SQL点滴15-在SQL Server 2008中调用C#程序 T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可 ...
- 快速构建Windows 8风格应用21-构建简单媒体播放器
原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...
- Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列
Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...
- DDD领域驱动设计
DDD领域驱动设计实践篇之如何提取模型 需求说明: 省级用户可以登记国家指标 省级用户和市级用户可以登记指标分解 登记国家指标时,需要录入以下数据:指标批次.文号.面积,这里省略其他数据,下同 登记指 ...
- Oracle索引——位图索引
1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...
- quartz_spring 定时器配置
quartz:石英,表达精确准时的意思. quartz-all-1.6.1.jar 主要用于定时任务管理. <?xml version="1.0" encoding=&quo ...
- 解决Github使用Fastly CDN而导致不能加载网页的方法
Github现在基本属于“安全”网站,但 Github使用fastly.net的CDN服务后,其网站在国内经常不能正常加载网页.github.global.ssl.fastly.net的亚洲IP一般为 ...
- Asp.Net MVC 上传图片到数据库
[读书笔记]Asp.Net MVC 上传图片到数据库(会的绕行) 之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存 ...