学习C++:使用std::fstream处理文件

在上一篇博文https://blog.csdn.net/wjinjie/article/details/104301129中,总结了标准输出流cout和标准输入流cin的用法。在使用C++做项目的过程中,经常会遇到处理文件(创建、读、写文件)的时候。因此本次主要介绍用于操作文件的输入和输出流std::fstream,fstream从ofstream那里继承了写入文件的功能,并从ifstream那里继承了读取文件的功能。
要使用std::fstream类或其基类(ofstream和ifstream),都需要包含头文件:

#include <fstream>

1.使用open()和close()打开和关闭文件

(1)要使用fstream类,需要使用open()打开文件

fstream myFile; //实例化一个文件对象
myFile.open("firstFile.txt", ios_base::in | ios_base::out | ios_base::trunc); //打开文件firstFile.txt,可选择三种模式
if(mfFile.is_open()) //检测open()是否成功
{
	Dosomething();   //读或写操作
	myFile.close();  //关闭文件流以保存其内容,这一步不能忘
}

open(“文件名的路径和名称”, ios_base::in | ios_base::out | ios_base::trunc)
第一个参数:是要打开文件的路径和名称(若没有提供路径,默认为应用程序的当前目录)
第二个参数:是文件的打开模式。ios_base::in(可读取文件)、ios_base::out(可写入文件)、ios_base::trunc(即便指定的文件存在,也重新创建它)
(2)除了使用open()打开文件,还可以使用fstream类的构造函数打开文件

//使用构造函数打开文件
fstream myFile("firstFile.txt", ios_base::in | ios_base::out | ios_base::trunc); 
//如果只想打开文件进行写入
ofstream myFile("firstFile.txt", ios_base::out);
//如果只想打开文件进行读取
ifstream myFile("firstFile.txt", ios_base::in);

注意:无论是使用成员方法open()还是构造函数来打开文件流,都建议在使用文件流对象前,使用is_open()检查文件打开操作是否成功。

2.使用open()创建文本文件并使用运算符<<写入文件

下面将演示使用ofstream新建一个文本文件并向其中写入文本:

#include <fstream>
#include <iostream>
using namespace std;

int main()
{
	ofstream myFile;
	myFile.open("firstFile.txt", ios_base::out); //以只写模式打开文件
	if(myFile.is_open())
	{
		cout<<"File open successful"<<endl;
		//使用运算符<<写入文件
		myFile<<"Hello File!"<<endl;
		myFile<<"Writing in file";
		myFile.close(); //关闭文件以保存其内容
	}
	return 0;
}

注:程序表明写入文件的方式与使用cout写入到标准输出的方式相同,都采用运算符<<。

3.使用open()和运算符>>读取文本文件

要读取文件,使用fstream或者ifstream,并使用标志ios_base::in打开它。下面将演示如何从已有的文件firstFile中读取文本:

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
	ifstream myFile;
	myFile.open("firstFile", ios_base::in);
	if(myFile.is_open())
	{
		cout<<"文件打开成功!文件中包含以下内容:"<<endl;
		string fileContents;
		while(myFile.good())  //判断当前流的状态是否正常。即当读到文件末尾时,自动跳出循环。
		{
			getline(myFile, fileContents);  //每次从文件中读取一行
			cout<<fileContents<<endl;
		}
		myFile.close();
	}
	else
		cout<<"打开文件失败,检查文件是否在正确的目录下!"<<endl;
	return 0;
}

注:这里没有使用提取运算符>>将文件内容直接读取,而是使用getline()从文件流中读取每一行,直到文本末尾。

发布了12 篇原创文章 · 获赞 13 · 访问量 613

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/104303770