一、文件流

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 0;
}

参考:

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

文件流(fstream, ifstream, ofstream)的打开关闭、流状态的更多相关文章

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

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

  2. C++中的fstream,ifstream,oftream

    https://blog.csdn.net/kingstar158/article/details/6859379 先mark一个大佬的随笔,有时间再回头看 总结: 使用ifstream和ofstre ...

  3. 详解文件操作(ifstream、ofstream、fstream)[转]

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  4. c++ ifstream ofstream 文件流

    #include <fstream>ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中fstream //读写操作,对打开的文件可进 ...

  5. Linux C编程--打开和关闭流

    以下函数用于打开和关闭一个流.#include <stdio.h>FILE * fopen (const char *pathname, const char *opentype);int ...

  6. 标准I/O库之打开和关闭流

    下列三个函数打开一个标准I/O流. #include <stdio.h> FILE *fopen( const char *restrict pathname, const char *r ...

  7. fopen(),fclose() 打开/关闭文件

    打开/关闭/刷新流 1. fopen() 打开流 功能: 1)fopen()打开由 path指定的一个文件. 2)fdopen()获取一个先有的文件描述符,并使一个标准的I/O流与该描述相结合.此函数 ...

  8. ZENCART 打开/关闭日志文件

    优秀的php开源程序很多都只带生成日志文件的功能,这类功能的开发可以帮助到站长在调试网站的时候及时的改正网站存在的错误,但是这类错误日志由来并非网站出现什么严重不可挽救的错误,大部分是一些未定义变量这 ...

  9. open(),close() 打开/关闭文件

    Open open()是一个系统调用函数,用来打开或创建一个文件,通过不同的oflag选项实现不同功能. 使用时open()函数需要包含的头文件:<sys/types.h>,<sys ...

随机推荐

  1. oracle定时任务(dbms_job)

    author:skate time:2007-09-12 http://publish.it168.com/2006/0311/20060311017002.shtml 今天总结下Oracle的任务队 ...

  2. matlab mex中C++内存全局共享和持久化

    为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库: 然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该 ...

  3. POJ2352【树状数组】

    个人NO.1 一开始题意理解有错. 一星星左下边有N颗星星,那它的等级就是N. 一开始理解必须X,Y两个坐标都小于,后来根据样例看了一下只要左下方即可,X,Y坐标都小于等于即可,但不包括星星本身. # ...

  4. linux中grep命令的使用

    转载:http://blog.csdn.net/universsky/article/details/8866402 linux中grep命令的使用 grep (global search regul ...

  5. linux上SVN解决冲突的办法

    转载:http://www.aixchina.net/club/thread-25902-1-1.html 这里,先说说冲突解决. 怎么会发生冲突呢? 两个人修改了不同文件?不会有冲突,他们不相关. ...

  6. Setup SS5 Socks Proxy

    Install and configure ss5 socks proxy with simple authentication SS5 is a high performance socks pro ...

  7. Netty框架

    Netty框架新版本号:3.0.2.GA,于2008年11月19日公布.Netty项目致力于提供一个异步的.事件驱动的网络应用框架和工具,用于高速开发可维护的.高性能的.高扩展性的server和cli ...

  8. java springMVC 报400错误问题

    java springMVC 中如果报400错误 很有可能是因为时间转换的问题. 我在项目中就遇到了这个问题,是因为我少引用了一个库,如果是因为时间问题的话添加以下依赖就可以解决. <depen ...

  9. 领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. SPOJ 8222 NSUBSTR(SAM)

    这几天看了N多论文研究了下后缀自己主动机.刚開始蛋疼的看着极短的代码和clj的论文硬是看不懂,后来结合其它几篇论文研究了下.总算是明确了一些 推荐文章http://blog.sina.com.cn/s ...