文件IO类

头文件fstream定义了三种类型来支持文件 IO,ifstream从一个给定的文件读取数据,ofstream向一个给定文件写入数据,fstream可以读写给定文件,当文件流对象被销毁时,会自动关闭绑定的文件。

int main(void)
{
	//创建一个未绑定的文件流
	std::fstream file1;
	std::ifstream file2;
	std::ofstream file3;

	//创建一个文件流,以默认的模式(根据文件流的类型)打开文件,然后与流绑定
	std::fstream file4("1.txt");
	std::ifstream file5("1.txt");
	std::ofstream file6("1.txt");

	//创建一个文件流,以指定模式打开文件,然后与流绑定
	std::fstream file7("1.txt",std::ios_base::app);
	std::ifstream file8("1.txt", std::ios_base::app);
	std::ofstream file9("1.txt", std::ios_base::app);

	//打开一个文件,然后与流绑定
	file7.open("1.txt");
	file7.open("1.txt", std::ios_base::app);

	//关闭与流绑定的文件
	file7.close();

	//指出与流绑定的文件是否成功打开且尚未关闭
	file7.is_open();
	system("pause");
	return 0;
}

fstream重载了bool运算符,所以我们可以通过if语句判断fstream是否成功打开了文件。

int main(void)
{
	std::ifstream in("1.txt");
	if (in) {
		std::cout << "open file success" << std::endl;
	}
	else {
		std::cout << "open file failed" << std::endl;
		std::cout << in.rdstate()<< std::endl;
	}
	system("pause");
	return 0;
}

文件模式

ios_base定义了一组flag来控制文件处理模式,这些flag可以用操作符|来组合,每个文件流类型都定义了一个默认的文件模式,ifstream默认以in模式打开,ofstream默认以out模式打开,fstream默认以in|out模式打开。

flag

描述

in

打开,用于读取

out

打开,用于写入

app

写入始终位于文件尾部

ate

打开文件后令读/写位置移至文件尾部(at end)

trunc

将先前文件的内容抹除

binary

二进制模式,不要替换特殊字符,例如换行

flag

描述

C模式(fopen)

in

读取文件,来源文件必须存在

r

out

清空后写入

w

out|trunc

清空后写入

w

out|app

追加

a

app

追加

a

in|out

读和写,最初位置在起点,来源文件必须存在

r+

in|out|trunc

清空后读写

w+

in|app

在尾端读写

a+

in|out|app

在尾端读写

a+

指定文件模式有如下限制:

  • 只可以对ofstream或fstream对象设定out模式。
  • 只可以对ifstream或fstream对象设定in模式。
  • 只有当out也被设定时才可设定trunc模式。
  • trunc模式和app模式不能同时使用。
  • app模式下不用显式指定out模式也能以写入方式打开文件。
  • 默认情况下即使没有trunc模式,out模式也会将之前的文件内容清除,为了保留文件内容,我们可以同时指定in模式或app模式。
  • 有些flag不是标准规格的一部分,不具有可移植性,例如nocreate(打开文件时文件必须存在)。