上一篇博客写到了标准输入输出流iostream,这次我们来看一下它的子类文件输入输出流的使用。作为标准输入输出流的子类,父类具有的一些方法文件输出流当然可以继承过来了,这就意味着你可以使用标准输入输出流进行的一些操作,文件流也是可以的。文件流新增加的俩个函数是open和close,就是用来打开和关闭文件的,需要传入char * 类型的参数,关于他们的使用和要点我们通过代码来体现吧。

#include <iostream>
#include <fstream> //包含文件流类的头文件

using namespace std;

int main(int argc,char * argv[])
{
	//文件输入流
	ifstream input;

	//我们一般无法确定文件的长度,所以将文件名存入到string对象中,而在很多的函数中,需要的都是
	//char *类型的参数,这个时候,我们只是需要string的一个函数就可以完成string类型向char *类型的转换了
	//这个函数就是c_str();这个函数经常的用到,一定要记住了
	string str = "main.cpp";

	//打开和关闭文件使用的是open和close函数,使用open的时候需要传入文件名
	//也可以在ifstream或者是ofstream的构造函数中传入这个参数,这样的话,输入输出流就和特定的文件相关联了
	//ifstream input(str.c_str());,这样用的话,就不需要open函数了
	input.open(str.c_str());

	//这个是用来对是否成功打开了文件进行检查的
	//当我们已经打开了一个文件,使用同样的流再打开另一个文件的时候要先关闭当前文件再打开新的文件,否则
	//这个input就会为false,大家可以打开以下的注释分别进行测试
	/*input.close();
	input.open("1.txt");*/
	if(!input)
	{
		cout<<"file can not open!\n";
		exit(-1);
	}

	char a;
	while(input>>a)
	{
			cout<<a;
	}
	//记得关闭文件
	input.close();

	//文件输出流
	//ofstream output,第二个参数是用来指定文件打开的模式的,上边之所以没有写是因为我们采用了默认的
	//方式,ifstream默认的方式当然是in了,ofstream的默认方式当然是out了,而app是追加的方式,不会清空
	//原来文件的内容
	ofstream output("2.txt",ofstream::app);
	while(output)
	{
		output<<"zaojiahua\n";
		break;
	}
	output.close();

	return 0;
}

这里还有一点需要注意的是,当我们使用一个流对象打开多个文件的时候,打开新文件之前要关闭旧的文件这个当然没有错,但同时记得使用clear()方法清空流对象的一些位标志(内部状态),比如说达到了文件尾的这些标志,它们并不会随着文件的关闭,这些标志就被清空,所以我们要记得清空哦!一句话,文件和文件流是不一样的,文件模式是和文件相互绑定的,它决定我们以什么样的方式使用文件,而文件流的这些内部状态也是文件流专有的关闭了文件他们当然不会消失的。