C++阶段03笔记03【文件操作(文本文件读写、二进制文件读写)】

本文介绍了C++中文件操作的基础,包括文本文件的写入与读取,以及二进制文件的读写方法,通过实例展示了如何使用fstream、ofstream和ifstream进行操作。

C++| 匠心之作 从0到1入门学编程【视频+课件+笔记+源码】

目录

5、文件操作

5.1、文本文件

5.1.1、写文件

5.1.2、读文件

5.2、二进制文件

5.2.1、写文件

5.2.2、读文件


5、文件操作

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化

C++中对文件操作需要包含头文件 #include <fstream>,文件类型分为2种:

  1. 文本文件:文件以文本的ASCII码形式存储在计算机中

  2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:1.ofstream写操作;2.ifstream读操作;3.fstream读写操作。o-output、i-input

5.1、文本文件

5.1.1、写文件

写文件步骤如下:

  1. 包含头文件 #include <fstream>

  2. 创建流对象 ofstream ofs;

  3. 打开文件 ofs.open("文件路径",打开方式);

  4. 写数据 ofs << "写入的数据";

  5. 关闭文件 ofs.close();

文件打开方式
打开方式解释
ios::in为读文件而打开文件
ios::out为写文件而打开文件
ios::ate初始位置:文件尾
ios::app追加方式写文件
ios::trunc如果文件存在先删除,再创建
ios::binary二进制方式

注意:文件打开方式可以配合使用,利用|操作符。例如:用二进制方式写文件ios::binary | ios:: out

#include <iostream>
#include <fstream>//1、包含头文件<fstream>
using namespace std;

void test01() {
	//2、创建流对象
	ofstream ofs;
	//3、指定打开方式
	ofs.open("test.txt", ios::out);
	//4、写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	ofs << "年龄:18" << endl;
	//5、关闭文件
	ofs.close();
}
int main() {
	test01();
	system("pause");
	return 0;
}

总结:

  1. 文件操作必须包含头文件fstream;

  2. 读文件可以利用ofstream,或者fstream类;

  3. 打开文件时候需要指定操作文件的路径,以及打开方式;

  4. 利用<<可以向文件中写数据;

  5. 操作完毕,要关闭文件。

5.1.2、读文件

读文件与写文件步骤相似,但是读取方式相对于比较多。

读文件步骤如下:

  1. 包含头文件 #include <fstream>

  2. 创建流对象 ifstream ifs;

  3. 打开文件并判断文件是否打开成功 ifs.open("文件路径",打开方式);

  4. 读数据,四种方式读取

  5. 关闭文件 ifs.close();

#include <iostream>
#include <fstream>//【1】包含头文件
#include <string>
using namespace std;

void test01() {
	//【2】创建流对象
	ifstream ifs;

	//【3】打开文件,并且判断文件是否打开成功
	ifs.open("test.txt", ios::in);
	if (!ifs.is_open())	{
		cout << "文件打开失败!" << endl;
		return;
	}

	//【4】读取文件数据
	//第1种方式
	//char buf[1024] = { 0 };//字符数组
	//while (ifs >> buf) {
	//	cout << buf << endl;
	//}

	//第2种方式
	//char buf[1024] = { 0 };
	//while (ifs.getline(buf, sizeof(buf))) {
	//	cout << buf << endl;
	//}

	//第3种方式
	//string buf;
	//while (getline(ifs, buf)) {
	//	cout << buf << endl;
	//}

	//第4种方式
	char c;
	while ((c = ifs.get()) != EOF) {//eof:end of file
		cout << c;
	}

	//【5】关闭文件
	ifs.close();
}

int main() {
	test01();
	system("pause");
	return 0;
}

总结:

  1. 读文件可以利用ifstream ,或者fstream类;

  2. 利用is_open函数可以判断文件是否打开成功;

  3. close关闭文件。

5.2、二进制文件

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

5.2.1、写文件

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

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

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

总结:文件输出流对象可以通过write函数以二进制方式写数据。

#include <iostream>//二进制文件-写文件
#include <fstream>//1、包含头文件
#include <string>
using namespace std;

class Person {
    public:
        char m_Name[64];//姓名
        int m_Age;//年龄
};

void test01() {
	//2、创建输出流对象
	ofstream ofs("person.txt", ios::out | ios::binary);
	//3、打开文件
	//ofs.open("person.txt", ios::out | ios::binary);
	//4、写文件
	Person p = {"张三", 18};
	ofs.write((const char *)&p, sizeof(p));//强转
	//5、关闭文件
	ofs.close();
}

int main() {
	test01();
	system("pause");
	return 0;
}

5.2.2、读文件

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

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

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

文件输入流对象可以通过read函数以二进制方式读数据。

#include <iostream>
#include <fstream>//1、包含头文件
#include <string>
using namespace std;

class Person {
    public:
        char m_Name[64];//姓名
        int m_Age;//年龄
};

void test01() {
	//2、创建流对象
	//ifstream ifs;
	ifstream ifs("person.txt", ios::in | ios::binary);
	//3、打开文件,判断文件是否打开成功
	//ifs.open("person.txt", ios::in | ios::binary);
	if (!ifs.is_open())	{
		cout << "文件打开失败!" << endl;
	}
	//4、读文件
	Person p;
	ifs.read((char *)&p, sizeof(Person));//(char *)强转
	cout << "姓名:" << p.m_Name << ",年龄:" << p.m_Age << endl;
	//5、关闭文件
	ifs.close();
}

int main() {
	test01();
	system("pause");
	return 0;
}

通宵玩游戏能带来快感,通宵学习工作也能带来延迟的成就感,二者又有什么区别呢?人各有所求,只要代价是现在和未来的自己承受得起的。本质上还是因为自己的眼光和格局,阅历不到位。


好一片石尽鸟投林,落了片白茫茫大地真干净。——《红楼梦》


华语群星-锵剑慨歌(剧情版)   自号混世,也长醉急枕臂窥星穹;启鞘试锋,终唤得掌心万钧霆动。

[cp]我的一生应当这样度过:当我回首往事的时候,我因自己的虚度年华而感到自在,也因自己的碌碌无为而感到满足。
但理智又告诉我不能这样活,今年读了很多书,认识了几个新朋友,学会了拍照,学会了化妆,尝试让自己去接触到许多新事物。
这半年你的目标实现了多少呢?#我的年中总结# ​[/cp]

[cp]涓涓细流汇成大海,点点星光点亮银河。祝家人们大学一别,前程似锦。 愿他年再相逢,卿依然眉眼如初。[/cp]

或忠信而死节兮,或訑谩而不疑。秉忠贞之志,守谦退之节。

春林花多媚,春鸟意多哀。
春风复多情,吹我罗裳开。
朝登凉台上,夕宿兰池里。
乘月采芙蓉,夜夜得莲子。
仰头看桐树,桐花特可怜。
愿天无霜雪,梧子解千年。
渊冰厚三尺,素雪覆千里。
我心如松柏,君情复何似?​

我是风希,裂风之王,半身为鱼半身为鸟,必将一统乱星海,拯救碧天苍海生灵!点击下方大拇指,助我神器出世,一举捣毁星宫!​

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

upward337

谢谢老板~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值