C++基础-文件操作
文件操作(输入输出流)
文件操作的概述
程序运行时产生的数据都属于零食数据,程序一旦运行结束,就会被释放
通过文件可以将数据持久化
C++中对文件的操作包含头文件
文件类型分为两种
- 文本文件:文件以文本的ASCII码的形式存储在计算机中
- 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不直接读他们
操作文件的三大类
- ofstream:读文件
- ifstream:写文件
- festream:读写文件
文本文件
写文件
步骤
-
包含头文件
#include<fstream>
-
创建流对象
ofstream ofs;
-
打开文件
ofs.open("文件路径",打开方式);
-
写数据
ofs << "写入的数据";
-
关闭文件
ofs.cloSe()
打开方式
- 文件的打开方式可以配合使用,用|操作符(eg:los::binary | ios::in)
路径
- 没有指明路径的化,默认和当前项目的路径一致
- 可以用绝对,也可以用相对
例子
#include<iostream>
#include<fstream> //添加头文件
using namespace std;
void test01(){
ofstream ofs; //创建流对象
ofs.open("test.txt",ios::out); //打开的地址和方式
ofs << "你好" << endl; //文件的内容
ofs.close(); //关闭文件
}
int main(int argc, char** argv) {
test01();
return 0;
}
读文件
步骤相对于写文件多一点
步骤
-
包含头文件
#include<fstream>
-
创建流对象
ifstream ifs;
-
打开文件并判断释放打开成功
ifs.open("文件路径",打开方式); if(!ifs.is_open()){ cout << "文件打开失败" << endl; return; }else{...}
-
读数据
一共四种...
-
关闭文件
ifs.cloSe()
例子
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
void test01(){
ifstream ifs;
ifs.open("test.txt",ios::in);
if(!ifs.is_open()){ //判断是否打开成功
cout << "文件打开失败" << endl;
return;
}else{
//第一种
// char buf[1024] = {0};
// while(ifs >> buf){ //将ifs的数据放入buf中,当数据读完时,返回false,结束循环(不读取数据)
// cout << buf <<endl;
// }
//第二种
// char buf[1024] = {0};
// while (ifs.getline(buf,sizeof(buf))){ //getline:一行一行的读取
// cout << buf << endl;
// }
// }
//第三种
// string buf;
// while(getline(ifs,buf)){ //ifs一行一行读到buf中
// cout << buf << endl;
// }
//第四种(不建议用)
char c;
while((c = ifs.get()) != EOF){ //EOF :文件的尾部标志
cout << c; //不要加endl;
}
ifs.close(); //关闭文件
}
}
int main(int argc, char** argv) {
test01();
return 0;
}
小小练习-复制文件
在上面代码的基础上将已经创建好的test.txt文件复制到test1.txt文件下
#include<fstream> //添加头文件
#include<iostream>
#include<cstring>
using namespace std;
void test01(){
ofstream ofs; //创建对象
ifstream ifs;
ifs.open("test.txt",ios::in); //路径和方式
ofs.open("test1.txt",ios::out);
if(!ifs.is_open()){ //复制过程
cout << "文件打开失败" << endl; //判断是否打开成功
return;
}else{
string buf;
while(getline(ifs,buf)){ //读文件
ofs << buf << "(test.txt复制成功)" << endl; //写(复制)文件
// 添加标识,判断复制是否成功
}
}
ofs.close(); //关闭文件
ifs.close();
}
int main(int argc, char** argv) {
test01();
return 0;
}
二进制文件
在以二进制读、写文件的时候要加多加一个‘ios::binary’
写文件
二进制方式读文件主要利用流对象调用函数write(读出的部分数据看不懂没有关系,只要还能读回来就可以啦)
函数类型:ofs.write((const char *) &buffer,int len);
参数解释:buffer指向内存中的一段数据;len是要读取的字节数
例子
#include<fstream>
#include<iostream>
using namespace std;
class Person{ //写个类读读
public:
char m_Name[64]; //最好用char
int m_Age;
};
void test01(){
ofstream ofs("Person.txt",ios::binary | ios::out); //可以一步写哦
//ofs.open("Person.txt",ios::binary | ios::out);
Person p = {"Tom" ,18}; //造个对象
ofs.write((const char*)&p,sizeof(p)); //用write函数读出来
ofs.close();
}
int main(int argc, char** argv) {
test01();
return 0;
}
读文件
二进制方式读文件主要利用流对象调用函数read
函数类型:ofs.read((const char *) &buffer,int len);
参数解释:buffer指向内存中的一段数据;len是要读取的字节数
例子
#include<fstream> //是同一个Person,年龄是20咯(类哦)
#include<iostream> //我把读的也写进来了,这样更灵活一点
using namespace std;
class Person{
public:
char m_Name[64];
int m_Age;
};
void test01(){
//写文件
ofstream ofs("Person.txt",ios::binary | ios::out); //可以一步写哦
//ofs.open("Person.txt",ios::binary | ios::out);
Person p = {"Tom" 20}; //改个对象的参数()
ofs.write((const char*)&p,sizeof(p));
ofs.close();
//读文件
ifstream ifs("Person.txt",ios::binary | ios::in);
if(!(ifs.is_open())){
cout << "文件打开失败" << endl;
return;
}else{
Person p;
ifs.read((char*)&p,sizeof(p));
cout << p.m_Name << p.m_Age <<endl;
}
ifs.close();
}
int main(int argc, char** argv) {
test01();
return 0;
}
为进一步验证是对同一个文件操作,可以做如下检验
else{
Person p = {"Petter",250};//再次修改
ifs.read((char*) &p,sizeof(p));
cout << p.m_Name << p.m_Age <<endl;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)