文件操作
在程序运行时产生的数据属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化
对文件操作需要包含头文件
文件的类型
1、文本文件,文件以文本的ASCLL码形式存储在计算机中
2、二进制文件,文件以文本的二进制文件形式存储在计算机
操作文件的三大类
1、ofstream:写操作
2、ifstream:读操作
3、fstream:读写操作
写文件
//1、包含头文件
#include<fstream>
//2、创建对象流
ofstream ofs;
//3、打开文件
ofs.open("文件路径",打开方式);
//4、写数据
ofs << "写入的数据";
//5、关闭文件
ofs.close();
打开方式
文件打开方式可以配合使用,利用 | 操作符
如:用二进制方式写文件 : ios::binary | ios::out
//1、包含头文件
#include<fstream>
void test01()
{
//2、创建流对象
ofstream ofs;
//3、指定打开方式
ofs.open("文件路径",ios::out);
//4、写内容
ofs << "姓名:张三" << endl;
ofs << "性别:男" << endl;
ofs << "年龄:18" << endl;
//5、关闭文件
ofs.close();
}
新建的文件,如果不指定文件,会默认存储在当前项目的目录下
读文件
//1、包含头文件
#include<fstream>
//2、创建对象流
ifstream ifs;
//3、打开文件,并且判断是否打开成功
ifs.open("文件路径",ios::in);
if(!ifs.is_open())//is_open() -> 判断是否打开成功,返回值的bool类
{
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)))//利用函数getline(char *, 最多读入的字节数)读一行文件,数组名指向第一个元素的地址类型正好是char *
{
cout << buf << endl;//输出读入的数据
}
<3>
string buf;
while(getline(ifs,buf))//这里的getline(基础的输入流,准备好的字符串)是全局函数
{
cout << buf << endl;//输出读入的数据
}
<4>//不推荐
char c;
while( (c= ifs.get()) != EOF )//EOF表示文件尾,end of file
{
cout << buf << endl;//输出读入的数据
}
//5、关闭文件
ifs.close();
二进制文件
打开方式为 ios::binary
class Person
{
public:
char m_name[64];//姓名
int m_age;//年龄
};
void test01()
{
//1、包含头文件
//2、创建流对象
ofstream ofs;
//3、打开文件
ofs.open("person.txt",ios::out | ios::binary);
//或者可以在创建流对象的时候直接进行初始化
// -> ofstream ofs("person.txt",ios::out | ios::binary);
//4、写文件
Person p = {"张三",18};
ofs.write((const char *)&p, sizeof(Person));//对p取地址之后,其返回的类型是Person*,但函数的原型要求是const char *,所以要强转
//关闭文件
ofs.close();
}
用二进制写入的文件,打开看可能会出现乱码的情况,但如果再读回来没错就行
读二进制文件
class Person
{
public:
char m_name[64];//姓名
int m_age;//年龄
};
//二进制文件 读文件
void test01
{
//包含头文件
//创建流对象
ifstream ifs;
//打开文件 判断文件是否打开成功
ifs.open("person.txt",ios::|ios::binary);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
//读文件
Person p;
ifs.read((char *)&p, sizeof(Person));
cout << "姓名:" << p.m_name << "年龄:" << p.m_name << endl;
//关闭文件
}