C++中基于流的文件操作

目录

1. 打开/关闭流操作

2. 读写操作

2.1 文本文件读写

2.2 二进制文件读写


C++对文件的操作以流为基础,使用stream类的派生类fstream实现,使用时需要增加头文件<fstream.h>。fstream可以通过构造函数指定某一个文件。

C++流文件操作由三种读写类型:

ofstream:给一个特定文件写入数据,只能写入文件
ifstream:从一个特定文件读出数据,只能读取文件
fstream:可以对特定文件读写操作

1. 打开/关闭流操作

// 1. 构造文件流对象,并使用open()函数以mode模式打开文件
fstream file1;
file1.open(filename,mode,0);

// 2. 构造文件流对象,并以默认模式打开文件
fstream file2(filename);

// 3. 构造文件流对象,并以mode模式打开文件
fstream file3(filename,mode);

// 4. 判断文件是否成功打开且没有关闭
file1.is_open();  // 该函数返回bool类型

// 5. 关闭文件
file1.close();

上面提到的open()函数声明如下:

void open(const char* filename,int openmode,int access);

参数说明:
@filename:要打开的文件名
@mode:要打开文件的方式
@access:打开文件的属性

mode模式有如下

ios::app: 以追加的方式打开文件,如果文件不存在,创建文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式
ios::in:  文件以输入方式打开(文件=>程序,读),如果文件不存在,打开失败
ios::out: 文件以输出方式打开 (程序=>文件,写)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0 

ifstream类默认打开文件的方式为ios::in
ofstream类默认打开文件的方式为ios::out
fstream类默认打开文件的方式为ios::in | ios::out

打开文件的属性access取值有:

        0 = 普通文件,打开访问;1 = 只读文件;2  = 隐含文件;4 = 系统文件

属性取值access和打开方式mode都可以用或 | 连接。

2. 读写操作

2.1 文本文件读写

文本文件写入可以使用<<符号。

读写文件时需要判断流状态,有以下常用流状态成员函数

eof();  // 如果到达文件末尾,返回 true
bad();  // 如果读写过程中出错,返回true
fail();  // 读写过程中出错或格式错误,返回true

读取文件可以使用getline()函数或运算符>>,getline会读取空格,只能读取字符串;>>会忽略空格。另外读写二进制文件时使用read()/write()函数。读取文本文件示例:

void CPlusPlus_file()
{
	const char *szFilename = "text1.txt";

	/**************************  写入文本文件 **************************/
	ofstream wfile(szFilename,ios::trunc);  // 以追加模式打开
	wfile << 1 << endl;
	wfile << 12 << endl;
	wfile << 123 << endl;
	wfile << 1234 << endl;
	wfile << "Hello World!" << endl;
	wfile.close();
	cout << "write end" << endl;
	cout << endl;

	std::ifstream file(szFilename);
	if(!file.is_open())
	{
		std::cout << "Open file FAILED:" << szFilename << std::endl;
		return;
	}
	/****************************  getline()读取文件  ****************************************/
	std::string strtmp;
	while(getline(file,strtmp))  // 这里也可以先判断读取文件时是否到达了文件末尾  while( !file.eof() && getline(file,strtmp))
	{
		cout << strtmp << endl;
	}
	file.close();
	cout << "getline() end" << endl;
	cout << endl;

	/******************************  >> 读取文件  ***************************************/
	file.open(szFilename,ios::in);
	if(!file.is_open())
	{
		std::cout << "Open file FAILED:" << szFilename << std::endl;
		return;
	}
	int itmp;
	while(file >> itmp)  // 这里也可以先判断读取文件时是否到达了文件末尾  while( !file.eof() && file >> itmp)
	{
		cout << itmp << endl;  //  >> 读取时只能读取指定类型的内容,这里是只读取整型
	}
	file.close();
	cout << ">> end" << endl;
	cout << endl;
}

2.2 二进制文件读写

二进制文件读的时候需要知道文件大小是多少,使用seekg()和ftellg()函,然后再使用read()函数读取数据。

void CPlusPlus_binfile()
{
	const char *szFilename = "LED_OP.hex";
	std::ifstream file(szFilename,ios::binary);
	if(!file.is_open())
	{
		std::cout << "Open file FAILED:" << szFilename << std::endl;
		return;
	}
	/****************************获取文件大小***********************/
	file.seekg(0,ios::end);  // 指针定位到文件末尾
	size_t len = file.tellg();  // 获取文件当前位置,即文件大小
	file.seekg(0,ios::beg);  // 指针定位到开头位置,开始读取数据
	/*************************** 读取数据 *****************/
	char *pbuf = new char[len];
	file.read(pbuf,len);
	file.close();
	/************************** 写入数据 ********************/
	const char *szFilename1 = "LED_OP1.hex";
	ofstream wfile(szFilename1,ios::binary);
	if(wfile.is_open())
	{
		wfile.write(pbuf,len);
		wfile.close();
	}
	delete[] pbuf;
}

参考:

1. fstream —文件读写操作_Xu小亿的博客-CSDN博客_fstream读写文件

2. C++ ifstream 读取文件大小和读取所有内容_Car12的博客-CSDN博客_ifstream获取文件大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值