【重学C/C++系列(七)】:文件操作基础

🔥 Hi,我是小余。本文已收录到 GitHub · Androider-Planet 中。这里有 Android 进阶成长知识体系,关注公众号 [小余的自习室] ,在成功的路上不迷路!

前言

内存中的数据在断电之后就会消失,如果需要持久化数据,则需要将数据写入到文件中

C++中使用输入流和输出流来操作文件:输入流起点和输出流的终点都可以是磁盘文件:
如:

cout<<"hello"<<endl;

cout是输出流的终点,可以把cout就看成是一个文件描述符,数据顺着<<流到cout这个文件中

cin>>char buf[];

cin是输入流的起点,可以把cin就看成是一个文件描述符,数据顺着>>从cin文件中流到buf数组中

C++中读写文件有两种文件格式

  • 文本格式:
    文件信息采用ASCII码进行存储,每个字符占用一个字节
  • 二进制文件:
    文件信息和内存中的信息一致,也就是二进制格式,一般情况下比较难看懂

1.文本文件读写

1.1 写文件:

  • 步骤:
1.包含头文件
#include <fstream>
2.创建流对象
ofstream ofs;
3.打开文件
ofs.open("文件路径名", 打开方式);

4.写文件数据
ofs << "写入的数据";
或者
ofs.write("数据",数据大小)

5.关闭流
ofs.close
  • 打开方式权限:
打开方式意义
iso::in只读方式
iso::out只写方式
ios::binary二进制方式写入
ios::app追加方式写文件
ios::trunc如果文件存在先删除,再创建
ios::ate可以和ios::in配合,此时定位到文件尾;如果没有ios::in相配合而只是同ios::out配合,那么将清空原文件;

注意:

上面的方式可以使用 | 操作符 配合使用
例如:用二进制方式写文件 ios::binary | ios::out

  • 写文件代码
#include <fstream>
void FIleTest::main() {
	//文本文件
	ofstream ofs;
	ofs.open("file.txt", ios::out);
	if (!ofs.is_open()) {
		return;
	}
	ofs<<"1234"<<"nihao"<<endl;
	ofs.close();
}

1.2 读文件

  • 步骤:
1.包含头文件

#include <fstream>

2.创建流对象

ifstream ifs;

3.打开文件并判断文件是否打开成功

ifs.open(""文件路径".打开方式);

4.读数据

1.ifs<<buf 
2.使用getLine逐行读取
3.ifs.read函数读取

5.关闭文件

ifs.close();
  • 读文件代码:
#include <fstream>
void FIleTest::main() {
	ifstream ifs("file.txt");
	if (!ifs.is_open()) {
		return;
	}
	char buf[100] = { 0 };	
	

	//方式1:
	char buf[1024] = {0};  //初始化一个全为0的数组
	while ( ifs >> buf )
	{
		cout << buf << endl;
	}
	
	//方式2:
	while()
	while (ifs.getline(buf, sizeof(buf))) {//逐行读取
		cout << buf << endl;
	}
	ifs.close();

}

2 二进制文件

以二进制的方式对文件进行读写操作:打开方式要指定为ios:binary

2.1 写文件

二进制方式写文件主要利用流对象调用成员函数write

函数原型:ostrean& warite( const char * buffer, int len);

参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数

代码如下:

class Person {

public :
	string m_name;
	int age;
	~Person() {

	}

};
void writeFile(string filename) {
	//二进制文件
	ofstream ofs1;
	ofs1.open(filename, ios::out | ios::binary);
	if (!ofs1.is_open()) {
		return;
	}
	Person per = { "123",10 };

	ofs1.write((const char*)&per, sizeof(Person));
	ofs1.close();

}

2.2 读文件

二进制方式读文件主要利用流对象调用成员函数read

函数原型:istream& read(char *buffer, int len);

参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数

代码如下:

void readFile(string filename) {
	ifstream ifs1(filename, ios::in);
	if (!ifs1.is_open()) {
		return;
	}
	Person per1;
	ifs1.read((char*)&per1, sizeof(Person));

	cout << per1.m_name << ":" << per1.age << endl;
	
	ifs1.close();

}

运行结果:
123:10

注意点:

对于is_open还是使用fail判断文件打开状态有什么不同:
一个是看文件流是否打开,说白了就是文件指针是否正常;一个是判断使用文件流过程中有没有出错,通过一些标志位来探测,二者检查的东西不一样。

文章完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值