IO类
iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型.
IO对象无拷贝或赋值
进行IO操作的函数通常以引用方式传递和返回流,读写一个IO对象会改变流的状态,因此传递和返回的引用不能是const的.
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据, 有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级操作.
刷新缓冲区
- 程序正常结束,缓冲区刷新被执行.
- 缓冲区满时,需要刷新缓冲区。
- 使用endl显式的刷新缓冲区.
- 每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区,默认情况下,cerr是设置unitbuf,因此写到cerr 的内容都是立即刷新的.
- 一个输出流可能会被关联到另一个流,在这种情况下,会被刷新.
- 程序崩溃,缓冲区不会被打印.
关联输入和输出流
标准库将cout和cin关联在一起,因此cin >> ival;会导致cout的缓冲区被刷新.
看一个关联的例子:
#include<iostream>
#include <fstream>
using namespace std;
int main(int argc,char *argv[])
{
ifstream in("test.txt");
streambuf *old_buf=cin.rdbuf(in.rdbuf());//这句话的意思是把cin流重定向到in流,但是rdbuf函数的返回值是调用该函数的流的指针.
string s;
while(cin >> s){
cout << s<<endl;
}
cin.rdbuf(old_buf);
return 0;
}
文件模式
C++fstream读写文件
ystruct 2015年12月14日 0 Comments
C++c++
IO类型间的关系:
类型ifstream和istringstream都继承自istream。因此,我们可以像使用istream对象来使用ifstream和istringstream对象,可以对一个ifstream或者istringstream对象调用getline函数,类型ofstream和ostringstream都继承ostream,因此,我们如何使用cout的,就可以同样地使用这些类型的对象.今天,我们只讨论fstream文件流
include
ofstream //文件写操作,内存写入存储设备(文件) 输出流
ifstream //文件读操作,存储设备到内存. 输入流
fstream //读写操作,对打开的文件可进行读写. 前两者的结合
1
2
3
4
include
ofstream //文件写操作,内存写入存储设备(文件) 输出流
ifstream //文件读操作,存储设备到内存. 输入流
fstream //读写操作,对打开的文件可进行读写. 前两者的结合
文件打开模式:
ios::in 读
ios::out 写
ios::w:app 从文件末尾开始写
ios::binary 二进制模式
ios::trunc 打开一个文件,然后清空内容
ios::ate 打开一个文件,将位置移动到文件尾.
ios::in 读
ios::out 写
ios::w:app 从文件末尾开始写
ios::binary 二进制模式
ios::trunc 打开一个文件,然后清空内容
ios::ate 打开一个文件,将位置移动到文件尾.
指定的模式有以下限制
1.只可以对ofstream或者fstream对象设定out模式.
2.只可以ifstream或fstream对象设定为in模式.
3.只有out被设定时,才可以设定为trunc模式.
4.trunc没被设置,才能设置app。在app模式下,默认以写的方式打开.
5.以out模式打开的文件也会被清空,所以,要想保留文件中额内容,同时要指定app模式. 或同时指定in 模式.
ifstream默认以in模式打开,当文件不存在时,打开失败.当然,也可以以ios::out模式打开,这样虽然不会报错,但是,我们并不能向文件中写数据,也就是说,这样做,没有任何意义.
ofstream默认以out和trunc打开,也就是说,当文件存在时,会清空文件的内容,那么,怎样才能使其在文件末尾追加呢,上面提到过,我们可以给ofstream对象加in或app模式, 使其不会清空文件内容,如果,文件不存在,则创建文件.