一、文件流

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 一下。

 C++ Code 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

 
#include <cassert>


#include <iostream>


#include <fstream>

using 
namespace std;

int main(
void)

{

    
/******************************************************/

    
//若不存在文件,会创建文件
    
//ofstream fout;
    
//fout.open("test.txt");
    ofstream fout(
"test.txt", ios::out | ios::app);

//判断流状态
    
//if (fout.is_open())
    
//{
    
//  cout<<"succ"<<endl;
    
//}
    
//else
    
//  cout<<"failed"<<endl;

//if (fout.good())
    
//{
    
//  cout<<"succ"<<endl;
    
//}
    
//else
    
//  cout<<"failed"<<endl;

//if (fout)
    
//{
    
//  cout<<"succ"<<endl;
    
//}
    
//else
    
//  cout<<"failed"<<endl;

//if (!fout)
    
//{
    
//  cout<<"failed"<<endl;
    
//}
    
//else
    
//  cout<<"succ"<<endl;

assert(fout);

    fout.close();

/************************************************************/

    
// 若文件不存在,不会创建文件
    ifstream fin(
"test2.txt");

//  assert(fin); //文件不存在,断言失败

fin.close();

    
/**********************************************************/

    
//ofstream fout1("test3.txt", ios::in | ios::out | ios::ate);
    
//ofstream fout2("test3.txt", ios::in | ios::out | ios::ate);

//ofstream fout1("test3.txt", ios::in | ios::out | ios::app);
    
//ofstream fout2("test3.txt", ios::in | ios::out | ios::app);

// app 和 ate 可以共存,以app为准
    ofstream fout1(
"test3.txt", ios::in | ios::out | ios::app | ios::ate);

    ofstream fout2(
"test3.txt", ios::in | ios::out | ios::app | ios::ate);

assert(fout1);

    assert(fout2);

fout1 << 
"X";

    fout2 << 
"Y"; 
//Y 输出在 X 的后面

fout1.close();

    fout2.close();

    
/****************************************************************/

// app 与 trunc 不能共存,流状态为fail
    ofstream fout3(
"test.txt", ios::out | ios::app | ios::trunc);

    
if (fout3.good())

    {

        cout << 
"good" << endl;

    }

    
if (fout3.bad())

    {

        cout << 
"bad" << endl;

    }

    
if (fout3.fail())

    {

        cout << 
"fail" << endl;

    }

    
if (fout3.eof())

    {

        cout << 
"eof" << endl;

    }

fout3.clear();

    fout3.open(
"test.txt"); 
// clear之后能够重新open
    
if (fout3)

    {

        cout << 
"open succ" << endl;

    }

    
else

        cout << 
"open failed" << endl;

fout3.close();

return 
;

}

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态的更多相关文章

  1. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  2. 从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写

    一.文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 ...

  3. 从零开始学 Web 之 JS 高级(二)原型链,原型的继承

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. 从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  6. 文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  7. 从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化 以ios类成员函数方式格式化)

    一.以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符.把它们作为插入操作符<<的输出对象即可.如setiosflags.setw.set ...

  8. 从零开始学 Web 系列教程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...

  9. 10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource

    前言 本文将上一节做的代码,对copy方法与关闭流方法进行封装,并使用try...with...resource关闭流. copy方法封装 我们将copy方法封装,使得只需传入两个流,就能将输入流的源 ...

随机推荐

  1. UITableView的常用方法

    一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...

  2. 【Unity 3D】学习笔记四十一:关节

    关节 关节组件能够加入至多个游戏对象中,而加入关节的游戏对象将通过关节连接在一起而且感觉连带的物理效果.须要注意的是:关节必须依赖于刚体组件. 关节介绍 关节一共分为5大类:链条关节,固定关节,弹簧关 ...

  3. CSS3 选择器读解

    文章资料来自于W3Cfuns CSS3.0 四个基本的结构性伪类选择器:root 此选择器将绑定到页面的根元素中,所谓根元素,是指文档树中最顶层的元素,也就是<html>部 分. < ...

  4. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  5. 5. SQL Server数据库性能监控 - 当前请求

    原文:5. SQL Server数据库性能监控 - 当前请求 对于在线运行的系统,当前数据库性能监控,通常监视以下几点: (1) 是否有阻塞 (Blocking); (2) 是否有等待 (Waitin ...

  6. Python 2.7.3 urllib2.urlopen 获取网页出现乱码解决方案

    出现乱码的原因是,网页服务端有bug,它硬性使用使用某种特定的编码方案,而并没有按照客户端的请求头的编码要求来发送编码. 解决方案:使用chardet来猜测网页编码. 1.去chardet官网下载ch ...

  7. 项目笔记---CSharp图片处理

    原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用 ...

  8. js 指定位置插入html标签(可编辑div)

    demo效果如下: html代码部分如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  9. web开发中的多线程死锁问题,避免死锁

    1.什么是死锁,产生死锁的原因,和产生死锁的必要条件 所谓死锁(DeadLock),是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局,当进程或线程处于僵局时,若无外力作用,它们将无法再向前推进 ...

  10. 深入浅出SQL注入

    原文:深入浅出SQL注入 之前在做学生信息管理系统和机房收费系统的时候,对于SQL注入的问题已经是司空见惯,但是并没有真正的地形象生动的理解SQL注入到底是什么玩意儿.直到这次做牛腩才在牛老师的举例之 ...