学习:文件操作
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
C++中对文件操作需要包含头文件
文件类型分为两种:
1、文本文件 - 文件以文本的ASCII码形式存储在计算机中
2、二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类:
1、ofstream:写操作
2、ifstream: 读操作
3、fstream : 读写操作
写文件操作
写文件步骤如下:
1、包含头文件
#include <fstream>
2、创建流对象
ofstream ofs;
3、打开文件
ofs.open("文件路径",打开方式);
4、写数据
ofs << "写入的数据";
5、关闭文件
ofs.close();
示例代码如下:
#include<iostream> #include<fstream> //包含头文件 using namespace std; int main() { //文件写操作 ofstream ofs; //创建流对象 ofs.open("1.txt", ios::out); //以写的方式打开并且是覆盖方式,发现如果文件不存在的时候,以写的方式打开文件会自动创建,读的方式不会 ofs << "test" << endl; ofs << "男" << endl; ofs << "18" << endl; ofs.close(); system("pause"); return 0; }
注意: 文件打开方式可以配合使用,利用|操作符
例如:用二进制方式写文件ios::binary | ios:: out
读文件操作
步骤其实和写文件的操作差不多,但是我们创建的流对象不一样,并且打开方式也不一样
示例代码如下:
#include<iostream> #include<fstream> //包含头文件 using namespace std; int main() { ifstream ifs;//创建流对象 ifs.open("1.txt", ios::in); //以读的方式打开 if (!ifs.is_open()) { //判断文件是否打开成功,如果打开失败就return cout << "文件读取失败" << endl; return 0; } //第一种方式进行读取 //char buf[1024] = { 0 }; //进行初始化操作 //while (ifs >> buf) { //进行读取操作 // cout << buf << endl;//输出读取到的内容 //} //第二种方式进行读取 //char buf[1024] = { 0 }; ////这里自己觉得有意思的是getline传入的buf的指针 //while (ifs.getline(buf, size(buf))) { //istream& getline (char* s, streamsize n ); // cout << buf << endl; //} //第三种方式进行读取 //这种也挺有意思的EOF 来判断 所以自己也写一下记录 char c; while ((c = ifs.get()) != EOF) //get进行单个字符读取,感觉有点鸡肋 { cout << c; } ifs.close(); //进行关闭文件的操作 system("pause"); return 0; }
操作二进制文件:
之前有提到过,用二进制方式写文件ios::binary | ios:: out
,自己了解用二进制来写文件,就是为了体现保密作用
二进制方式写文件主要利用流对象调用成员函数write
函数原型 :ostream& write(const char * buffer,int len);
示例代码如下:
#include<iostream> #include<string> #include<fstream> using namespace std; class Person { public: char name[64]; int age; }; int main() { ofstream ofs; //创建流对象 Person p1 = { "adexx" ,18}; //生成一个对象 ofs.open("1.txt", ios::out | ios::binary); //以二进制方式打开文件 ofs.write((const char *)&p1,sizeof(p1)); //二进制方法写入 注意的是第一个参数需要时const char指针类型,所以我们需要取地址进行强制性转换 ofs.close(); system("pause"); return 0; }
二进制读文件:
既然我们用二进制写文件,当然也要有二进制读文件的操作了
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char *buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
示例代码如下:
#include<iostream> #include<string> #include<fstream> using namespace std; class Person { public: char name[64]; int age; }; int main() { ifstream ifs; //创建流对象 Person p1; ifs.open("1.txt", ios::in | ios::binary); //以二进制方式打开文件 ifs.read((char *)&p1, sizeof(Person)); //istream& read(char *buffer,int len);,因为buffer指向内存的一段存储空间,所以我们读取的时候就存到p1对象中,并且内存大小为Person类的内存的大小,但是第一个参数为char得指针类型,所以拿到地址还需要转换 cout << p1.name << "," << p1.age << endl; ifs.close(); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY