浅谈C++|文件篇

引子:

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化。C++中对文件操作需要包含头文件< fstream > 。
C++提供了丰富的文件操作功能,你可以使用标准库中的fstream库来进行文件的读取、写入和定位等操作。文件操作在许多应用中非常常见,例如读取配置文件、处理日志、存储数据等。

首先,你需要包含`<fstream>`头文件,然后可以创建不同类型的文件流对象,如ifstream、ofstream和fstream,它们分别用于读取、写入和读写文件。

对于文件的读取,你可以使用ifstream对象。通过调用`open()`函数并指定文件名,你可以打开一个文件进行读取操作。然后,你可以使用`>>`和其他输入操作符从文件中读取数据,或者使用`getline()`函数逐行读取文件内容。

对于文件的写入,你可以使用ofstream对象。同样,通过调用`open()`函数并指定文件名,你可以打开一个文件进行写入操作。然后,你可以使用`<<`和其他输出操作符将数据写入文件中。

除了读取和写入文件,你还可以使用fstream对象进行读写混合的文件操作。例如,你可以使用`seekg()`和`seekp()`函数定位文件指针,以便在文件中进行随机读写操作。`tellg()`和`tellp()`函数可以获取文件指针的当前位置。

在进行文件操作时,记得检查文件是否成功打开,并确保在不再需要使用文件时关闭它。你可以使用`is_open()`函数检查文件是否成功打开,使用`close()`函数关闭文件。

除了基本的文件读写操作,C++还提供了其他功能,如二进制文件的读写、文件的追加写入、文件错误处理等。你可以根据具体需求查阅C++的相关文档,深入学习和应用这些功能。

在进行文件操作时,应注意文件路径的正确性,避免发生文件找不到或无法读取的问题。此外,操作文件时要考虑文件锁定和并发访问等问题,确保线程安全性和资源的正常释放。

总之,C++的文件操作功能非常强大和灵活,使你能够轻松处理各种文件操作需求。合理运用文件操作,可以简化代码、提高效率,并为数据的存储和管理提供便利。

一.基本知识:

1.1文件类型

文件类型分为两种:

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

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

1.2操作文件分类

操作文件的三大类:

  1. ifstream:读操作 io对应读写

2.ofstream:写操作

  1. fstream :读写操作

1.3文件步骤

1.包含头文件

#include <fstream>

2.创建流对象

ofstream ofs;

3.打开文件

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

4.写数据

ofs <<"写入的数据";

5.关闭文件

ofs.close();

1.4文件打开方式

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

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

写文件代码实例:

cpp 复制代码
#include <iostream>
#include <fstream>
using namespace std;
void fun() {
	//1.头文件
	//2.创建流对象
	fstream ofs;
	//3.指定打开方式
	ofs.open("test.txt", ios::out);
	//4.写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	//5.关闭文件
	ofs.close();
}
int main() {
	fun();
	return 0;
}

写文件可以用ofstream或 fstream

读文件代码实例:

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void fun() {
	//1.头文件
	//2.创建流对象
	fstream ofs;
	//3.指定打开方式
	ofs.open("test.txt", ios::out);
	//4.写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	//5.关闭文件
	ofs.close();
}

void fun1() {
	ifstream ofs;
	ofs.open("test.txt", ios::in);
	//ofs.is_open()打开失败返回false
	if (!ofs.is_open()) {
		cout << "文件打开失败" << endl;
	}
	//读数据
	// 
	//第一种
	char buf[1024] = { 0 };
	//ofs按行输入到buf中,每次循环覆盖上一次
	while (ofs >> buf) {
		cout << buf << endl;
	}

	//第二种
	char buf1[1024] = { 0 };
	//和第一种一样,限定最大的大小
	while(ofs.getline(buf1, sizeof(buf1)) ){
		cout << buf1 << endl;
	}
	//第三种
	string buf2;
	//从ofs输入到buf2中
	while (getline(ofs, buf2)) {
		cout << buf2 << endl;
	}

	//第四种,不推荐
	char c;
	while ((c=ofs.get())!=EOF) {
		cout << c;
	}
	ofs.close();
}
int main() {
	fun();
	fun1();
	return 0;
}

总结:

·读文件可以利用ifstream ,或者ftream类

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

. close关闭文件

二.二进制读取和写入

代码实例:

cpp 复制代码
#include <iostream>
//1.头文件
#include <fstream>
using namespace std;
class person {
public:
	int age;
	const char *name;    //C++要加const,学到了
};

void fun() {
	//2.打开数据流(读写模式)
	fstream ofs;
	//3.打开文件
	ofs.open("erjinzhi.txt", ios::out | ios::binary);
	//4.写数据
	person p;
	p.age = 18;
	p.name = "tom";
	ofs.write((const char*)&p,sizeof(person));
	p.age = 19;
	p.name = "tony";
	ofs.write((const char*)&p, sizeof(person));
	//5.关闭文件
	ofs.close();
}

void read() {
	//2.打开数据流模式
	fstream ofs;
	//3.打开文件
	ofs.open("erjinzhi.txt", ios::in | ios::binary);
	if (!ofs.is_open()) {
		cout << "打开失败" << endl;
	}
	//4.读数据
	person p;
	ofs.read((char*)&p, sizeof(p));
	cout << p.age << endl;
	cout << p.name << endl;
	ofs.read((char*)&p, sizeof(p));
	cout << p.age << endl;
	cout << p.name << endl;
	ofs.close();
}
int main() {
	fun();  //写文件
	read();
	return 0;
}

ofs.write((const char*)&p,sizeof(person));

ofs.open("erjinzhi.txt", ios::in | ios::binary);

注意这两个函数的用法即可

相关推荐
SoraLuna8 小时前
「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
算法·macos·cangjie
_可乐无糖13 小时前
mac终端使用pytest执行iOS UI自动化测试方法
macos·pytest
后端常规开发人员16 小时前
在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境
macos·docker·容器·宝塔
nukix18 小时前
Mac Java 使用 tesseract 进行 ORC 识别
java·开发语言·macos·orc
SoraLuna20 小时前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
Algorithm157621 小时前
mac上使用docker搭建gitlab
macos·docker·gitlab
余清歌21 小时前
macOS解决U盘装完系统容量变小的问题
macos
SoraLuna21 小时前
「Mac玩转仓颉内测版8」入门篇8 - Cangjie函数与方法
算法·macos·cangjie
zhlx283521 小时前
【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
macos·ios·cocoa
Mac分享吧1 天前
【iStat Menus for MacBook状态栏菜单系统监控工具--安装教程【简单操作,随时了解电脑情况】
macos·mac·istat menus·软件分享·系统数据监控