C++中对文件的操作的三个大类:
- 写操作:ofstream
- 读操作:ifstream
- 读写操作:fstream
要想实现对文件的读写操作,头文件中需要包含
#include<fstream>
文件操作中的mode
对于文件操作的mode有多种,分别为以下几种:
文件操作手段 | 对应mode代码 |
为读文件而打开文件 | ios::in |
为写文件而打开文件 | ios::out |
初始位置,文件尾 | ios::ate |
追加方式写文件 | ios::app |
如果文件存在先删除,在创建 | ios::trunc |
二进制方式 | ios::binary |
对于以上的操作mode,在一定情况下也能组合使用,比如:
//用二进制的方式写文件
ios::out|ios::binary
//用二进制的方式读文件
ios::in|ios::binary
读写文件的操作步骤
- 包含头文件(前面已经叙述过)
- 创建流对象
-
//若想要写文件,则用ofstream ofstream ofs; //若想要读文件,则用ifstream ifstream ifs;
- 打开文件(指定打开方式)
-
//如果是写文件 ofs.open("文件名",打开方式mode); //如果是读文件 ifs.open("文件名",打开方式mode); //一般对于读文件,可以加一段代码判断是否读取文件成功 if (!ifs.is_open()) { cout << "文件打开失败" << endl; return; }
- 开始写/读文件
-
//对于写文件 //1、写文件可以直接写入正常的字符串类型数据,比如 ofs << "姓名:" << "张三" << endl; ofs << "性别:" << "男" << endl; ofs << "年龄:" << "18" << endl; //2、如果需要写入一些比较特殊的类型,就要用到二进制读写,比如类内的数据 //写函数,需要强转成const 字符串类型 ofs.write((const char*)&对象,sizeof(对象)); //读函数,需要强转成char 字符串类型 ifs.read((char*)&对象, sizeof(对象));
//例子 //先创建一个类 class Person { public: char m_name[64];//姓名 int m_age; }; //写文件 void test01() { ofstream ofs; //用二进制的方式打开文件 ofs.open("person.txt", ios::out | ios::binary); //给类内的成员赋予值 Person p = { "张三",18 }; //write()函数中传入的参数类型 //(const char*)&p强转字符类型,write()函数的参数要求 ofs.write((const char*)&p,sizeof(p)); ofs.close(); } //读文件 void test02() { ifstream ifs; ifs.open("person.txt", ios::in | ios::binary); if (!ifs.is_open()) { cout << "文件打开失败" << endl; return; } Person p; ifs.read((char*)&p, sizeof(p)); cout << "姓名:" << p.m_name << " 年龄:" << p.m_age << endl; ifs.close(); }
输出结果
//写文件的结果
//如果没有设置文件路径,那么文件将会存储在cpp文件目录下
//打开文件可能会出现乱码的现象,属于正常情况
//读文件的结果
姓名:张三 年龄:18
请按任意键继续. . .
- 关闭文件流
//在所有的操作都做完后,需要关闭文件流
ofs.close();
//或
ifs.close();