Essential C++学习记录&笔记整理7(文件的读写)

到了比较难理解的一节了,加油啃!

文件的读写

1.要对文件进行读写操作,必须包含fstream头文件,即#include<fstream>

  • 为打开一个可供输出的文件,我们定义一个ofstream(供输出用的file stream)对象,并将文件名传入
//以输出模式开启seq_data.txt
ofstream outfile("seq_data.txt");
  • 如果指定的文件(()里的那个txt)并不存在,便会有一个文件被产生出来并打开供输出使用(新建一个文件)。
  • 如果指定的文件已经存在,这个文件会被打开用于输出,而文件中原有的数据会被丢弃。
  • 如果文件已经存在而且不希望丢弃原数据地将新数据添加到该文件中,就必须以追加模式打开这个文件。为此,需要第二个参数ios_base:app给ofstream对象
//以追加模式打开seq_data.txt
//新模式会被加到文件末尾
ofstream outfile("seq_data.txt",ios_base::app);
  • 在进行读写操作之前,必须确定文件打开成功!,最简单的办法是检验class object的真伪:
//如果outfile的求值结果为false,则表示此文件并未成功打开。
if(!outfile)

如果文件未能打开,则该ofstream对象的求值结果为false。我们可以将信息写入cerr(标准错误设备,cerr和cout一样,cerr将其输出结果定向到用户的终端,两者的唯一差别是cerr的输出结果并无缓冲(bufferred)情形,它会立即显示于用户的终端中

if(!outfile)//因为某种原因,文件无法开启
	cerr<<"输出结果(自己写的玩意儿,比如字符串啊,变量啊)"
else
	//文件开启成功,接下来写入数据进文件
	outfile<<usr_name<<' '
		   <<num_tries<<' '
		   <<num_right<<endl;

如果文件顺利打开,我们便可以将输出信息定向到该文件(就像将信息写入cout及cerr这两个ostream对象一样。)

  • 如果要打开一个可供读取的文件,我们可以定义一个ifstream(供输入的file stream)对象,并将文件名传入。
  • 如果文件未能成功打开,该ifstream对象返回false
  • 如果文件成功打开,该文件的写入位置会被设定在起始处
//以读取模式(input mode)打开infile
ifstream infile(""seq_data.txt");
if(!infile)
{
	//infile返回false,即文件未能成功打开,则进入if循环
}
else
{
	//文件成功打开,开始读取文件中的数据至程序中
	while(infile>>name)
	{
		infile>>a>>b;
		//...(要实现的操作等)
	}
}

程序解释:while循环的每一次迭代都会读取文件的下一行内容,这样的操作一直持续到文件末才结束。

infile>>name这条语句返回值就是从infile读到的class object,一旦读到文件末尾,对读入的class object求值结果就会是false,因此可以在while循环的条件表达式中作为结束循环的条件。

infile>>a>>b这样可以依次读取文件中的两个挨着的数据,并依照文件中的顺序分别赋值给a变量和b变量

  • 如果我们要同时读取和写入(读写)同一个文件,必须要定义一个fstream对象
fstream iofile(seq_data.txt",ios_base::in|ios_base::app)//记住iofile
//第二个参数这个写法即可!
if(!iofile)
{
	//文件未能成功打开
}
else
{
	//由于是以追加模式打开的文件,所以在开始读取!读取!读取!
	//之前,将文件重新定位在起始处,写入不需要seekg()!!!
	iofile.seekg(0);
	//...(要实现的操作等)
}

注意:没有在开始读取!读取!读取!之前先重新定位,就读取文件内容,
那么会立刻遇上“文件结束”的状况。由于此文件是以追加模式开启的,
因此任何
写入操作都会将数据添加在文件末尾中

  • seekg()函数可将iofile重新定位至文件起始处。

2.操纵符

  • endl是事先定义好的操纵符,由iostream库提供。操纵符并不会将数据写到iostream,也不会从中读取数据,其作用是在iostream上执行某些操作。
  • endl会插入一个换行符,并清除输出缓冲区(output buffer)的内容!
  • 其他事先定义好的操纵符,如hex(以十六进制显示整数)、oct(以八进制显示整数)、setprecision(n)(设定浮点数显示精度为n)等
发布了18 篇原创文章 · 获赞 1 · 访问量 241

猜你喜欢

转载自blog.csdn.net/weixin_45910408/article/details/105325935
今日推荐